• 企业400电话
  • 微网小程序
  • AI电话机器人
  • 电商代运营
  • 全 部 栏 目

    企业400电话 网络优化推广 AI电话机器人 呼叫中心 网站建设 商标✡知产 微网小程序 电商运营 彩铃•短信 增值拓展业务
    golang 阻止主goroutine退出的操作

    1:for

     //使用无线循环
     for{
     }

    如果想退出

     for {
        reutrn 
     }
     

    例如:启动三个 goroutine 等待三个 goroutine 执行结束一下 退出主 goroutine

    var c bool = false
    var nums int = 0
    for i := 0; i  3; i++ {
    go func() {
    fmt.Println("begin------------end")
    time.Sleep(10 * time.Second)
    nums++
    if nums == 2 {
    c = true
    }
    }()
    }
    for {
    if c == true {
    return
    }
    }

    2:chan

    var c = make(chan bool)
    ........
    .......
    - c

    如果想退出主进程 则

    c - true

    例如:启动三个 goroutine 等待三个 goroutine 执行结束一下 退出主 goroutine

    var c = make(chan bool)
    var nums int = 0
    for i := 0; i  3; i++ {
    go func() {
    fmt.Println("begin------------")
    time.Sleep(10 * time.Second)
    nums++
    if nums == 2 {
    c - true
    }
    }()
    }
    -c

    补充:golang使用之使用channel限制goroutine的数量

    golang虽然启动一个goroutine很廉价但并不是可以无限制的使用的.

    大多数的是用channel来限制goroutine的数量

    写了一个测试DEMO如下:

    package main 
    import (
     "fmt"
     "runtime"
     "time"
    )
     
    var (
     chanNum   = 3 //启动的数量
     readChan  = make(chan int)        //操作信息的channel
     limitChan = make(chan bool, 1000) //限制goroutine数量的channel,此处限制1000个
    )
     
    //初始人方法 
    func init() {
     fmt.Println("init")
     
     for i := 0; i  chanNum; i++ {
      go Queue(i, readChan) //开启工作池
     }
    }
     
    func main() {
     fmt.Println("main")
     
     //启一个go方法 , 无限制的往readChan里塞数据
     go func() {
      for {
       readChan - 1
      }
     }()
     
     //监听到键盘事件后程序退出
     var input string
     fmt.Scanln(input)
    }
     
    //工作池
    func Queue(qid int, rchan chan int) {
     var dat int
     t := time.Tick(time.Second) //定时器,一秒
     for {
      select {
      case d := -rchan:
       limitChan - true //缓冲区满之后阻塞,后面的readChan将等待
       dat += d
       go showNum(qid, dat) //每从channel接到一个数据就起一个goroutine,limitChan会限制goroutine的数量
      case -t:
       showGoNum(qid) //定时器,每秒打印一次当前 goroutine数量
      }
     }
    }
     
    func showNum(qid, i int) {
     //处理成功后在限制goroutine的Channel缓冲区里取一个数据,limitChan就可以再写入
     //使用Defer 确保limitChan的一个缓冲区被释放
     defer func() {
      -limitChan
     }()
     time.Sleep(time.Millisecond * 100) //模拟程序处理耗时 
     //fmt.Println(qid, "===========", i)
    }
     
    //显示当前goroutine数量 
    func showGoNum(qid int) {
     fmt.Printf("%d====numGo:==%d\n", qid, runtime.NumGoroutine())
    }

    执行结果如下:

    go run channel_limit_goroutine.go

    init

    main

    0====numGo:==1004

    1====numGo:==1003

    2====numGo:==1005

    1====numGo:==1005

    0====numGo:==1005

    2====numGo:==1005

    0====numGo:==1005

    1====numGo:==1005

    2====numGo:==1005

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

    您可能感兴趣的文章:
    • golang goroutine顺序输出方式
    • golang gin 框架 异步同步 goroutine 并发操作
    • Golang Goroutine的使用
    • GOLANG使用Context管理关联goroutine的方法
    • Golang 探索对Goroutine的控制方法(详解)
    • 关于Golang中for-loop与goroutine的问题详解
    • 解决Golang中goroutine执行速度的问题
    上一篇:在golang xorm中使用postgresql的json,array类型的操作
    下一篇:golang 后台进程的启动和停止操作
  • 相关文章
  • 

    © 2016-2020 巨人网络通讯 版权所有

    《增值电信业务经营许可证》 苏ICP备15040257号-8

    golang 阻止主goroutine退出的操作 golang,阻止,主,goroutine,退出,