博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Golang控制goroutine的启动与关闭
阅读量:6292 次
发布时间:2019-06-22

本文共 1077 字,大约阅读时间需要 3 分钟。

hot3.png

  最近在用golang做项目的时候,使用到了goroutine。在golang中启动协程非常方便,只需要加一个go关键字:

   

 go myfunc(){      //do something }()

   但是对于一些长时间执行的任务,例如:

 go loopfunc(){          for{      //do something repeat           }  }()

在某些情况下,需要退出时候却有些不方便。举个例子,你启动了一个协程,长时间轮询处理一些任务。当某种情况下,需要外部通知,主动结束这个循环。发现,golang并没有像java那样中断或者关闭线程的interrupt,stop方法。于是就想到了channel,通过类似信号的方式来控制goroutine的关闭退出(实际上并不是真的直接关闭goroutine,只是把一些长时间循环的阻塞函数退出,然后让goroutine自己退出),具体思路就是就是对于每个启动的goroutine注册一个channel。为了方便后续使用,我封装了一个简单的库:

原理比较简单,这里不详细说了,直接看源码就可以了。具体使用示例:

 

package mainimport (        "fmt"        "github.com/scottkiss/grtm"        "time"       )func myfunc() {    fmt.Println("do something repeat by interval 4 seconds")    time.Sleep(time.Second * time.Duration(4))}func main() {        gm := grtm.NewGrManager()        gm.NewLoopGoroutine("myfunc", myfunc)        fmt.Println("main function")        time.Sleep(time.Second * time.Duration(40))        fmt.Println("stop myfunc goroutine")        gm.StopLoopGoroutine("myfunc")        time.Sleep(time.Second * time.Duration(80))}

  

 

转载于:https://my.oschina.net/u/1446855/blog/643527

你可能感兴趣的文章
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>
SVN 命令笔记
查看>>
检验手机号码
查看>>
重叠(Overlapped)IO模型
查看>>
Git使用教程
查看>>
使用shell脚本自动监控后台进程,并能自动重启
查看>>
Flex&Bison手册
查看>>
solrCloud+tomcat+zookeeper集群配置
查看>>
/etc/fstab,/etc/mtab,和 /proc/mounts
查看>>
Apache kafka 简介
查看>>