這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
最近在用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 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))}