大家好,程间我是信息渔夫子。
今天给大家介绍的同步go channel的第二种应用:协程间同步信息。
通过channel,应用协能够确保一个协程在另一个协程完成工作之后才能继续。程间如果需要在两个或多个协程之间共享数据的信息场景中,这种用法就特别有用,同步并且能够确保数据不会同时被多个协程修改非常重要。应用协
我们先看一个简单的程间示例:
package mainimport ( "fmt" "time")func worker(done chan bool) { fmt.Print("working...") time.Sleep(time.Second) fmt.Println("done") done <- true}func main() { done := make(chan bool, 1) go worker(done) <-done}
在这个示例中,我们创建了一个worker协程,信息同时在main协程中创建了一个done通道。当worker协程完成工作后,往done通道中发送了一个true,代表通知main协程worker执行完毕了。
接下来我们看几个开源项目中的示例。
在gin框架的example中,有一个关闭服务的示例,就是利用了通道来在两个协程间进行通讯的特性。如下:
图片
这里就是在main协程中创建了一个quit通道,然后并将该quit通道传递给signal.Notify函数,然后通过<-quit阻塞等待signal.Notify函数执行完毕。在signal.Notify中其实是注册并监听syscall.SIGTERM信号,通过启动了一个新的协程来监听该信号。当该信号发生时,就往quit通道中写入一个os.Signal的数据。
在fastcache开源项目中,有个功能是将数据保存到文件中。在保存函数中用到了并发保存,同时需要将每个保存的结果输出。下面就是通过通道来接收每个协程的保存结果的功能。如下:
图片
在上图中,首先在save函数中初始化了一个results通道,然后将saveBuckets的结果输出到results。在save函数的最下面,通过从results等待输出每次saveBuckets的结果。你看,这里就是通过results通道将子协程中的结果输出给save函数(父协程)了。
好了,今天通道的应用案例就分享到这里了。
责任编辑:武晓燕 来源: Go学堂 go开源项目(责任编辑:娱乐)
大别山革命老区正式迎来“高铁时代” 黄黄高铁正线全长126.85公里
Android Go 终于来了,Google 想要靠它获取下一个 10 亿用户
节能元件(08231.HK)发布公告:预计年度由亏转盈60万美元
微信全面开放“原创声明”与“留言”功能,抄袭号再也不能钻空子了
凯撒文化(002425.SZ)公布消息:一季度净利润预增80%