項目地址:https://github.com/chenhg5/go...
有時候我們為了更好的利用電腦資源,可以把一些耗時間長度的任務隊列化非同步執行。舉個對應簡單的生活中例子就是大多數餐廳裡面點菜都是先找地方做,看了菜單選好菜之後找服務員點菜,此時再等待菜做好送上來。這裡餐廳廚房就是電腦的底層資源,菜就是待執行的任務,而服務員就是我們的go channel。
關於訊息佇列有很多好用的架構,如nsq,nats,kafka等等。但有時我們只需要輕量級的非同步任務工具,而不需要太過於"複雜"的架構相對於我們的需求來說。於是借鑒一些項目架構,做了一個小小的封裝。
go-task的使用很簡單,只需要初始化一個任務處理器,然後往處理器裡面新增工作,然後處理器就會非同步地去執行了。
舉餐廳的例子,代碼如下:
package mainimport ( "runtime" "fmt" "time" "github.com/chenhg5/go-task")func main() { // init task.InitTaskReceiver(runtime.NumCPU()) // 有十個人同時點菜 for i := 0; i < 10; i++ { task.AddTask(task.NewTask( map[string]interface{}{ "paramA" : "value", }, // 參數 []task.FacFunc{ordering, cooking, deliverying}, // 工作清單 -1), // -1代表任務不逾時 ) } time.Sleep(time.Second * 50)}// 下單任務func ordering(uuid string, param map[string]interface{}) (string, error) { fmt.Println("i am ordering") time.Sleep(time.Second * 1) return uuid, nil}// 做菜任務func cooking(uuid string, param map[string]interface{}) (string, error) { fmt.Println("i am cooking") time.Sleep(time.Second * 1) return uuid, nil}// 配送任務func deliverying(uuid string, param map[string]interface{}) (string, error) { fmt.Println("i am deliverying") time.Sleep(time.Second * 1) return uuid, nil}
跑一遍,就會看到:
i am orderingi am orderingi am orderingi am orderingi am orderingi am orderingi am orderingi am orderingi am cookingi am cookingi am cookingi am cookingi am cookingi am cookingi am cookingi am cookingi am deliveryingi am deliveryingi am deliveryingi am deliveryingi am deliveryingi am deliveryingi am deliveryingi am deliveryingi am orderingi am orderingi am cookingi am cookingi am deliveryingi am deliverying