Golang控制goroutine的启动与关闭

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

      //do something }()

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

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

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

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

package main
 
import (
        "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))
}

作者:Sirk 出处:http://www.cnblogs.com/vimsk

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2017-04-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏更流畅、简洁的软件开发方式

【自然框架】 页面里的父类——把共用的东东都交给父类,让子类专注于其他。

【类图】 ? 【命名空间】——————————————————【文件截图】 ? ? 可能您会问,不就是弄个父类吗,怎么又是这么复杂呢?这个嘛,听...

23680
来自专栏Golang语言社区

41. select阻塞一个gorountine上的多个通讯操作 | 厚土Go学习笔记

select 语句可以使得一个 goroutine 在多个通讯操作上等待。select 会阻塞,直到条件分支中的某个分支可以执行,就执行此分支。当多个分支都准备...

38280
来自专栏jiajia_deng

Cmder git 中文显示乱码解决方案

Cmder 是 Windows 下替换原有 cmd 的绝佳工具,但是与默认的 cmd 一样,都与 git 命令行存在一些兼容性问题,比如中文乱码问题。在 Cmd...

44620
来自专栏陈本布衣

treeview插件使用:根据子节点选中父节点

  鄙人公司没有专门的前端,所以项目开发中都是前后端一起抡。最近用bootstrap用的比较频繁,发现bootstrap除了框架本身的样式组件外,还提供了多种插...

59340
来自专栏程序员的知识天地

JavaWeb学习——4.XML

要写xml,第一步必须要有一个文档声明(写了文档声明之后,表示写xml文件的内容)

13420
来自专栏mySoul

node函数 node路由

访问连接 http://127.0.0.1:1937/hello%20word.html

19340
来自专栏王磊的博客

富编译器汇总及二次开发Demo

富文本编译器汇总 名称 总大小 当前版本 官方地址 扩展方法 xhEditor 1.43 MB v1.1.14 http://xheditor.com...

33850
来自专栏守望轩

Visual Studio 2008 每日提示(二十三)

#221、在对象浏览器中按对象和成员排序 原文链接:You can sort objects and members in the Object Browse...

38960
来自专栏小特工作室

Navi.Soft31.开发工具(含下载地址)

1系统简介 1.1功能简述 在软件开发过程中,我们需要经常对字符串、文件、数据库操作。有时需要浏览Json格式串,有时需要浏览Xml格式串,有时需要读取txt或...

25090
来自专栏老马寒门IT

07Vue.js快速入门-Vue路由详解

对于前端来说,其实浏览器配合超级连接就很好的实现了路由功能。但是对于单页面应用来说,浏览器和超级连接的跳转方式已经不能适用, 所以各大框架纷纷给出了单页面应用...

39350

扫码关注云+社区

领取腾讯云代金券