最近在用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))
}
