golang协程未正确执行

在使用go开发时,协程没有执行就结束了整个运行过程。

代码示例如下:

package main

import "fmt"

func main() {
    go doAction()
    go doAction()
}

func doAction() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
}

  

开了两个协程执行doAction函数,却没有任何打印输出,就结束了运行。

 

 

原因分析


之前写Node.js的时候,都是单线程,没有出现过这种情况,

而GO语言是有一个主线程执行main函数,怀疑是不是因为主线程很快执行完,另外开的两个建立在主线程上的协程会被强制关闭?

尝试加了个延迟代码

time.Sleep(5000)

果然,正常打印了。

经过查阅资料,确认了:

Go语言中,当main函数运行结束后,所有正在运行的协程都会终止, 也就是说主线程就已经退出了,两个协程中的函数来不及执行,所以看不到打印。

 

 

 

 

 

解决方案


使用延迟肯定不是业务开始适用的方式,建议采用go语言的另一个特性,channel来解决,如下示例:

package main

import "fmt"

func main() {
    ch := make(chan struct{})
    count := 2 // 协程个数
    go doAction()
    go doAction()

    for range ch {
        count--
        if count == 0 {
            close(ch)
        }
    }
}

func doAction() {
    for i := 0; i < 5; i++ {
        fmt.Println(i)
    }
    ch <- struct{}{} // 协程结束,发出信号
}
点击并拖拽以移动

  

 

 

 

 

原文地址:https://www.cnblogs.com/yourstars/p/15186620.html