golang 如何结束一个协程


本文摘自php中文网,作者(*-*)浩,侵删。

goroutine和channel是Go语言非常棒的特色,它们提供了一种非常轻便易用的并发能力。但是当您的应用进程中有很多goroutine的时候,如何在主流程中等待所有的goroutine 退出呢?

1 通过Channel传递退出信号 (推荐学习:go)

Go的一大设计哲学就是:通过Channel共享数据,而不是通过共享内存共享数据。主流程可以通过channel向任何goroutine发送停止信号,就像下面这样:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

func run(done chan int) {

        for {

                select {

                case <-done:

                        fmt.Println("exiting...")

                        done <- 1

                        break

                default:

                }

  

                time.Sleep(time.Second * 1)

                fmt.Println("do something")

        }

}

  

func main() {

        c := make(chan int)

  

        go run(c)

  

        fmt.Println("wait")

        time.Sleep(time.Second * 5)

  

        c <- 1

        <-c

  

        fmt.Println("main exited")

}

这种方式可以实现优雅地停止goroutine,但是当goroutine特别多的时候,这种方式不管在代码美观上还是管理上都显得笨拙不堪。

阅读剩余部分

相关阅读 >>

golang语言社区--游戏服务器编程说明

使用go defer时要注意这两处!

golang grpc无法安装原因

golang语言社区--unity3d学习 第1期 如何学习unity3d

聊聊dubbo-go-proxy的authorityfilter

手撸golang 结构型设计模式 组合模式

我的golang error 最佳实践

golang- go语言学习笔记之定义变量

golang 实现bitmap

golang怎么编译

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...