协程(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时指定。
来源:CSDN
作者:、moddemod
链接:https://blog.csdn.net/weixin_43833642/article/details/103455826