這裡介紹一個控制golang併發數量的包gowork,當然都是可以自己實現的,只是每次去實現比較麻煩罷了。
如果只是啟一個goroutine那就沒有必要使用,當然這個包也是支持的。
實現原理:
用戶告知要啟用的併發數量,然後包內會啟動相當於併發數量的一個工作池。這樣之後程序猿只要往工作池裡面發任務就可以了。
當然你需要的是實現你的worker。原型:
type WorkFunction func(req interface{}, res interface{})
還可以實現異常處理的函數,原型和worker一樣,同時在使用的時候gowork會自動將任務參數req對應的傳給異常處理函數,你需要做的是通過req獲取異常處理結果,當然你也可以不要這些結果。
使用:
控制同時併發數量為5,new一個WorkManager來管理goroutine,通過
NewGoroutine啟動worker池,然後就可以AddRequest發布任務去執行了。
package main import ( "fmt" "github.com/qianlnk/gowork" ) type People struct { Id int Name string } func SayHello(request, response interface{}) { req := request.(People) fmt.Printf("Hello, I'm %s, My ID is %d.\n", req.Name, req.Id) } func SingSong(request, response interface{}) { req := request.(People) fmt.Printf("My ID is %d, what I will sing is test_%s\n", req.Id, req.Name) } func main() { wm := gowork.NewWorkManager() wm.NewGoroutine("sayhello", 5, SayHello, nil) wm.NewGoroutine("singsong", 5, SingSong, nil) go func() { for i := 1; i < 20; i++ { pl := People{ Id: i, Name: fmt.Sprintf("hello%d", i), } wm.AddRequest("sayhello", pl) } wm.Done("sayhello") }() for i := 0; i < 20; i++ { pl := People{ Id: i, Name: fmt.Sprintf("song%d", i), } wm.AddRequest("singsong", pl) } wm.Done("singsong") }
當然 ,如果你願意你也可以把發布任務也起成goroutine這樣調用Done的時候程序會等待任務發佈完成並全部執行結束。
具體使用可以移駕github:
有疑问加站长微信联系(非本文作者)