前言
有時(shí)候我們?yōu)榱烁玫睦糜?jì)算機(jī)資源,可以把一些耗時(shí)長(zhǎng)的任務(wù)隊(duì)列化異步執(zhí)行。舉個(gè)對(duì)應(yīng)簡(jiǎn)單的生活中例子就是大多數(shù)餐廳里面點(diǎn)菜都是先找地方做,看了菜單選好菜之后找服務(wù)員點(diǎn)菜,此時(shí)再等待菜做好送上來(lái)。這里餐廳廚房就是計(jì)算機(jī)的底層資源,菜就是待執(zhí)行的任務(wù),而服務(wù)員就是我們的go channel。
關(guān)于消息隊(duì)列有很多好用的框架,如nsq,nats,kafka等等。但有時(shí)我們只需要輕量級(jí)的異步任務(wù)工具,而不需要太過(guò)于"復(fù)雜"的框架相對(duì)于我們的需求來(lái)說(shuō)。于是借鑒一些項(xiàng)目框架,做了一個(gè)小小的封裝。
項(xiàng)目地址: https://github.com/chenhg5/go... (本地下載)
go-task的使用很簡(jiǎn)單,只需要初始化一個(gè)任務(wù)處理器,然后往處理器里面添加任務(wù),然后處理器就會(huì)異步地去執(zhí)行了。
舉餐廳的例子,代碼如下:
package main
import (
"runtime"
"fmt"
"time"
"github.com/chenhg5/go-task"
)
func main() {
// init
task.InitTaskReceiver(runtime.NumCPU())
// 有十個(gè)人同時(shí)點(diǎn)菜
for i := 0; i 10; i++ {
task.AddTask(task.NewTask(
map[string]interface{}{
"paramA" : "value",
}, // 參數(shù)
[]task.FacFunc{ordering, cooking, deliverying}, // 任務(wù)列表
-1), // -1代表任務(wù)不超時(shí)
)
}
time.Sleep(time.Second * 50)
}
// 下單任務(wù)
func ordering(uuid string, param map[string]interface{}) (string, error) {
fmt.Println("i am ordering")
time.Sleep(time.Second * 1)
return uuid, nil
}
// 做菜任務(wù)
func cooking(uuid string, param map[string]interface{}) (string, error) {
fmt.Println("i am cooking")
time.Sleep(time.Second * 1)
return uuid, nil
}
// 配送任務(wù)
func deliverying(uuid string, param map[string]interface{}) (string, error) {
fmt.Println("i am deliverying")
time.Sleep(time.Second * 1)
return uuid, nil
}
跑一遍,就會(huì)看到:
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am ordering
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am cooking
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am deliverying
i am ordering
i am ordering
i am cooking
i am cooking
i am deliverying
i am deliverying
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
您可能感興趣的文章:- golang中for循環(huán)遍歷channel時(shí)需要注意的問(wèn)題詳解
- golang實(shí)現(xiàn)基于channel的通用連接池詳解
- Golang優(yōu)雅關(guān)閉channel的方法示例
- golang中單向channel的語(yǔ)法介紹
- golang判斷chan channel是否關(guān)閉的方法
- Golang中channel使用的一些小技巧
- Golang中channel的原理解讀(推薦)