• 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{}{} // 协程结束,发出信号
    }
    点击并拖拽以移动
    

      

     

     

     

     

  • 相关阅读:
    java.lang.UnsupportedOperationException: Not supported by BasicDataSource
    c# seo 百度sitemap书写
    c# 泛型原理(旧)
    apache 服务器配置常用知识点合集
    sass 基本常识
    c# TryParse
    webpack 配置热更新
    c# ref和out 详解
    IIS applicationHost.config 查找历史
    c# webapi 自定义返回数据
  • 原文地址:https://www.cnblogs.com/yourstars/p/15186620.html
Copyright © 2020-2023  润新知