基于golang channel實(shí)現(xiàn)的輕量級(jí)異步任務(wù)分發(fā)器示例代碼
前言
有時(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ì)腳本之家的支持。
相關(guān)文章
go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例
這篇文章主要為大家介紹了go Antlr重構(gòu)腳本解釋器實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
Go Gin框架中的binding驗(yàn)證器使用小結(jié)
Gin框架中的binding驗(yàn)證器為我們提供了簡(jiǎn)便的數(shù)據(jù)綁定和驗(yàn)證功能,通過(guò)合理使用binding和validate標(biāo)簽,我們可以確保API接口的數(shù)據(jù)合法性和完整性,這篇文章主要介紹了Go Gin框架中的binding驗(yàn)證器使用指南,需要的朋友可以參考下2024-07-07
Go語(yǔ)言微服務(wù)中實(shí)現(xiàn)鏈路追蹤
在微服務(wù)架構(gòu)中,鏈路追蹤技術(shù)可以幫助我們跟蹤請(qǐng)求在各個(gè)服務(wù)之間的傳播路徑,本文就來(lái)介紹一下Go語(yǔ)言微服務(wù)中實(shí)現(xiàn)鏈路追蹤,感興趣的可以了解一下2024-12-12
Go語(yǔ)言sync.Map詳解及使用場(chǎng)景
Go語(yǔ)言中的sync.Map是一個(gè)高效的并發(fā)安全映射結(jié)構(gòu),適用于高并發(fā)讀多寫(xiě)少的場(chǎng)景,它通過(guò)讀寫(xiě)分離、無(wú)鎖讀取路徑、寫(xiě)入時(shí)的鎖保護(hù)等機(jī)制,提高了讀取性能并減少了鎖競(jìng)爭(zhēng),sync.Map不需要手動(dòng)管理鎖,降低了編程復(fù)雜性,適合需要簡(jiǎn)單并發(fā)訪(fǎng)問(wèn)的場(chǎng)合2024-10-10
Go語(yǔ)言入門(mén)學(xué)習(xí)之Channel通道詳解
go routine可以使用channel來(lái)進(jìn)行通信,使用通信的手段來(lái)共享內(nèi)存,下面這篇文章主要給大家介紹了關(guān)于Go語(yǔ)言入門(mén)學(xué)習(xí)之Channel通道的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句用法及示例詳解
這篇文章主要為大家介紹了Go語(yǔ)言基礎(chǔ)if條件語(yǔ)句的用法及示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2021-11-11
idea搭建go環(huán)境實(shí)現(xiàn)go語(yǔ)言開(kāi)發(fā)
這篇文章主要給大家介紹了關(guān)于idea搭建go環(huán)境實(shí)現(xiàn)go語(yǔ)言開(kāi)發(fā)的相關(guān)資料,文中通過(guò)圖文介紹以及代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用go具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2024-01-01

