日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何在Go中實(shí)現(xiàn)一個Worker-Pool?

本文轉(zhuǎn)載自微信公眾號「吳親強(qiáng)的深夜食堂」,作者吳親庫里。轉(zhuǎn)載本文請聯(lián)系吳親強(qiáng)的深夜食堂公眾號。

創(chuàng)新互聯(lián)公司-成都網(wǎng)站建設(shè)公司,專注成都做網(wǎng)站、網(wǎng)站建設(shè)、網(wǎng)站營銷推廣,域名申請,網(wǎng)站空間網(wǎng)站托管運(yùn)營有關(guān)企業(yè)網(wǎng)站制作方案、改版、費(fèi)用等問題,請聯(lián)系創(chuàng)新互聯(lián)公司

之前寫過一篇文章,它有個響亮的名字:Handling 1 Million Requests per Minute with Go使用 Go 每分鐘處理百萬請求

這是國外的一個作者寫的,我做了一篇說明,起的也是這個標(biāo)題。

沒想到閱讀量是我最好的一篇,果然文章都是靠標(biāo)題出彩的…..

今天偶然看到另一篇文章(原文在文末[1])。兩篇文章原理相似:有一批工作任務(wù)(job),通過工作池(worker-pool)的方式,達(dá)到多worker并發(fā)處理job的效果。

他們還是有很多不同的點(diǎn),實(shí)現(xiàn)上差別也是蠻大的。

首先上一篇文章我放了一張圖片,大概就是上篇整體的工作流。

  • 每個worker處理完任務(wù)就好,不關(guān)心結(jié)果,不對結(jié)果做進(jìn)一步處理。
  • 只要請求不停止,程序就不會停止,沒有控制機(jī)制,除非宕機(jī)。

這篇文章不同點(diǎn)在于:

首先數(shù)據(jù)會從generate(生產(chǎn)數(shù)據(jù))->并發(fā)處理數(shù)據(jù)->處理結(jié)果聚合。

圖大概是這樣的,

然后它可以通過context.context達(dá)到控制工作池停止工作的效果。

最后通過代碼,你會發(fā)現(xiàn)它不是傳統(tǒng)意義上的worker-pool,后面會說明。

下圖能清晰表達(dá)整體流程了。

順便說一句,這篇文章實(shí)現(xiàn)的代碼比 使用 Go 每分鐘處理百萬請求 的代碼簡單多了。

首先看job。

這個可以簡單過一下。最終每個job處理完都會包裝成Result返回。

下面這段就是核心代碼了。

整個WorkerPool結(jié)構(gòu)很簡單。jobs是一個緩沖channel。每一個任務(wù)都會放入jobs中等待處理woker處理。

results也是一個通道類型,它的作用是保存每個job處理后產(chǎn)生的結(jié)果Result。

首先通過New初始化一個worker-pool工作池,然后執(zhí)行Run開始運(yùn)行。

初始化的時候傳入worker數(shù),對應(yīng)每個g運(yùn)行work(ctx,&wg,wp.jobs,wp.results),組成了worker-pool。

同時通過sync.WaitGroup,我們可以等待所有worker工作結(jié)束,也就意味著work-pool結(jié)束工作,當(dāng)然可能是因?yàn)槿蝿?wù)處理結(jié)束,也可能是被停止了。

每個job數(shù)據(jù)源是如何來的?

對應(yīng)每個worker的工作,

每個 worker 都嘗試從同一個jobs獲取數(shù)據(jù),這是一個典型的fan-out模式。當(dāng)對應(yīng)的g獲取到j(luò)ob進(jìn)行處理后,會把處理結(jié)果發(fā)送到同一個results channel中,這又是一個fan-in模式。

當(dāng)然我們通過context.Context可以對每個worker做停止運(yùn)行控制。

最后是處理結(jié)果集合,

那么整體的測試代碼就是:

看了代碼之后,我們知道,這并不是一個傳統(tǒng)意義的worker-pool。它并不像上篇這篇文章一樣,初始化一個真正的worker-pool,一旦接收到j(luò)ob,就嘗試從池中獲取一個worker,把對應(yīng)的job交給這個work進(jìn)行處理,等work處理完畢,重新進(jìn)行到工作池中,等待下一次被利用。

附錄

[1]https://itnext.io/explain-to-me-go-concurrency-worker-pool-pattern-like-im-five-e5f1be71e2b0#fe56


本文題目:如何在Go中實(shí)現(xiàn)一個Worker-Pool?
分享路徑:http://m.5511xx.com/article/cdeogop.html