最近在用golang作項目的時候,使用到了goroutine。在golang中啓動協程很是方便,只須要加一個go關鍵字:java
go myfunc(){ //do something }()
可是對於一些長時間執行的任務,例如:git
go loopfunc(){ for{ //do something repeat } }()
在某些狀況下,須要退出時候卻有些不方便。舉個例子,你啓動了一個協程,長時間輪詢處理一些任務。當某種狀況下,須要外部通知,主動結束這個循環。發現,golang並無像java那樣中斷或者關閉線程的interrupt,stop方法。因而就想到了channel,經過相似信號的方式來控制goroutine的關閉退出(實際上並非真的直接關閉goroutine,只是把一些長時間循環的阻塞函數退出,而後讓goroutine本身退出),具體思路就是就是對於每一個啓動的goroutine註冊一個channel。爲了方便後續使用,我封裝了一個簡單的庫:https://github.com/scottkiss/grtmgithub
原理比較簡單,這裏不詳細說了,直接看源碼就能夠了。具體使用示例:golang
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)) }