Go Channel应用:协程间信息同步

开发 前端
在fastcache开源项目中,有个功能是将数据保存到文件中。在保存函数中用到了并发保存,同时需要将每个保存的结果输出。下面就是通过通道来接收每个协程的保存结果的功能。

大家好,我是渔夫子。

今天给大家介绍的go channel的第二种应用:协程间同步信息。

通过channel,能够确保一个协程在另一个协程完成工作之后才能继续。如果需要在两个或多个协程之间共享数据的场景中,这种用法就特别有用,并且能够确保数据不会同时被多个协程修改非常重要。

我们先看一个简单的示例:

package main

import (
    "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中利用通道输出结果

在fastcache开源项目中,有个功能是将数据保存到文件中。在保存函数中用到了并发保存,同时需要将每个保存的结果输出。下面就是通过通道来接收每个协程的保存结果的功能。如下:

图片图片

在上图中,首先在save函数中初始化了一个results通道,然后将saveBuckets的结果输出到results。在save函数的最下面,通过从results等待输出每次saveBuckets的结果。你看,这里就是通过results通道将子协程中的结果输出给save函数(父协程)了。

好了,今天通道的应用案例就分享到这里了。

责任编辑:武晓燕 来源: Go学堂
相关推荐

2023-07-13 08:06:05

应用协程阻塞

2024-05-29 08:05:15

Go协程通信

2016-10-28 17:39:47

phpgolangcoroutine

2018-12-04 14:00:41

协程编程模式PHP

2021-05-21 08:21:57

Go语言基础技术

2020-12-27 10:15:44

Go语言channel管道

2024-06-27 07:56:49

2021-04-25 09:36:20

Go协程线程

2021-09-16 09:59:13

PythonJavaScript代码

2022-10-28 10:45:22

Go协程GoFrame

2024-08-27 09:46:39

Go协程效率

2023-11-17 11:36:59

协程纤程操作系统

2021-09-27 23:28:29

Go多协程并发

2024-07-01 08:44:42

Go语言协程

2023-10-24 19:37:34

协程Java

2021-12-09 06:41:56

Python协程多并发

2021-05-13 21:58:00

高并发应用Asyncio

2022-09-06 20:30:48

协程Context主线程

2023-08-08 07:18:17

协程管道函数

2024-02-05 09:06:25

Python协程Asyncio库
点赞
收藏

51CTO技术栈公众号