关于golang中消费协程优雅退出的写法,写了一个简单的小例子进行记录一下。
使用场景:
1、生成协程生产数据到管道中
2、消费协程在管道中取数据进行处理
通过捕捉特定信号对程序进行相关处理,当某个信号进行触发的时候,主协程将向各个协程发送退出指令,当数据管道处理完成时,若接收到退出指令 将结束协程的执行
package main
import (
"fmt"
"git.code.oa.com/gongyi/gongyi_base/log"
"os"
"os/signal"
"sync"
"syscall"
"time"
)
var dataChan chan int
/*************************测试生产类*************************/
type TestProducer struct {
closedChan chan struct{
}
wg sync.WaitGroup
}
func (producer *TestProducer)Produce() {
defer producer.wg.Done()
data := 1
for {
dataChan<-data
log.Infof("push data:%d succ", data)
data++
time.Sleep(time.Second * 1)
select {
// 若关闭了通道,直接退出
case <-producer.closedChan:
return
// 不可阻塞
default

这篇博客探讨了在Golang中如何实现消费协程的优雅退出。通过创建生成协程向管道发送数据,消费协程从管道接收并处理数据。当捕获到特定信号时,主协程会向所有协程发送退出通知。当数据处理完毕且收到退出指令后,协程会终止执行。
最低0.47元/天 解锁文章
651

被折叠的 条评论
为什么被折叠?



