协程

让人想犯罪 __ 提交于 2019-12-09 15:25:51

协程(Coroutine)本质上是一种用户态线程,不需要操作系统来进行抢占式调度,且在真正的实现中寄存于线程中,因此,系统开销极小,可以有效提高线程的任务并发性,而避免多线程的缺点。

goroutine是Go语言中轻量级线程实现,由Go运行时(runtime)管理。在一个函数调用前加上关键字go,这次调用就会在一个新的goroutine中并发执行,当被调用的函数返回时,这个goroutine也自动结束了。需要注意的是,如果这个函数有返回值,那么这个返回值就会被丢弃。

example

package main

import (
	"fmt"
)

func Add(x, y int) {
	z := x + y
	fmt.Println(z)
}

func main() {
	for i := 0; i < 10; i++ {
		go Add(i, i)
	}
}

实际上面这段程序什么都不会输出,是什么原因让明明调用了十次函数的代码最终什么都没显示呢?

这里因为主函数启动了十个goroutine,然后返回,这个时候陈需就退出了,而被启动的goroutine还没来得执行,所以程序没有任何输出。

要让主函数等待所有goroutine退出后再返回,如何知道goroutine都退出了呢?这就引出了多个goroutine之间通信的问题。

在工程上,两种最常用的并发通信模型:共享数据和消息。

Go语言提供的消息机制通常被称为channel。
“不要通过共享内存来通信,而应该通过通信来共享内存”

channel是Go语言在语言级别提供的goroutine间的通信方式,我们可以通过使用channel在两个或多个goroutine之间传递消息。channel是进程内的通信方式,因此通过channel传递对象的过程和调用函数时参数传递行为比较一致,比如也可以传递指针等。

channel是类型相关的。也就是说,一个channel只能传递一种类型的值,这个类型需要在声明channel时指定。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!