女人荫蒂被添全过程13种图片,亚洲+欧美+在线,欧洲精品无码一区二区三区 ,在厨房拨开内裤进入毛片

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用Worker pool解決異步任務的問題

Linux愛好者 ? 來源:blog.xizhibei.me ? 作者:blog.xizhibei.me ? 2022-06-08 14:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

【導讀】本文介紹了 Go 移步任務隊列的實現。

在一些常見的場景中,如果遇到了某些請求特別耗時間,為了不影響其它用戶的請求以及節約服務器資源,我們通常會考慮使用異步任務隊列去解決,這樣可以快速地處理請求、只返回給用戶任務創建結果,等待任務完成之后,我們再告知用戶任務的完成情況。

對于 Golang,我們可以通過 Worker pool 異步處理任務,在大多數情況下,如果不在意數據丟失以及服務器性能足夠,我們就沒有必要考慮別的方案,畢竟這樣實現非常簡單。

接下來我們先來說說如何用 Worker pool 解決異步任務的問題。

Worker pool

Worker pool,也有叫做 Goroutine pool 的,都是指用 Go channel 以及 Goroutine 來實現的任務隊列。Go channel 本質上就是一個隊列,因此用作任務隊列是很自然的。

在我們不用 Go channel 的時候,我們也許會使用這樣的方式來處理異步任務:

fori:=0;i100;i++{
gofunc(){
//processjob
}()
}

這樣的方式是不推薦的,因為在請求量到達一定程度,系統處理不過來的時候,會造成 Goroutine 的爆炸,拖慢整個系統的運行,甚至程序的崩潰,數據也就完全丟失了。

如果我們用簡單的方式,可以看看接下來的例子:一個發送者(也叫做生產者),一個接受者(也叫做消費者,或者 Worker):

typeJobstruct{...}
jobChan:=make(chanJob)
quit:=make(chanbool)
gofunc(){
select{
casejob:=<-jobChan:
???case<-?quit:
???return
}
}()

fori:=0;i100;i++{
jobChan<-?Job{...}
}
close(jobChan)
quit<-?true

如果 Worker 不夠,我們可以增加,這樣可以并行處理任務:

fori:=0;i10;i++{
gofunc(){
forjob:=rangejobChan{
//processjob
}
}()
}

這樣,一個非常簡單的 Worker pool 就完成了,只是,它對任務的處理還會有問題,比如無法設置超時、無法處理 panic 錯誤等。

實際上,目前已經有很多的開源庫可以幫你實現了,以worker pool為關鍵詞在 GitHub 上可以搜到一大堆:

  • GitHub - Jeffail/tunny: A goroutine pool for Go
  • GitHub - gammazero/workerpool: Concurrency limiting goroutine pool

那么,它們的缺點呢?

很明顯,它們的缺點就在于缺乏管理,可以說是完全不管任務的結果,即使我們加日志輸出也只是為了簡單監控,更要命的就是進程重啟的時候,比如進程掛了,或者程序更新,都會導致數據丟失,畢竟生產者與消費者在一個進程中的時候,會互相影響(搶占 CPU 與內存資源)。因此前面我也說了,在不管這兩個問題的時候,可以考慮用。

如果數據很重要(實際上,我認為用戶上傳的業務數據都重要,不能丟失),為了解決這些問題,我們必須換一種解決方案。

分布式異步任務隊列

接下來再說說異步的分布式任務隊列,要用到這個工具的時候,我們大致有以下幾個需求:

  • 分布式:生產者與消費者隔離;
  • 數據持久化:在程序重啟的時候,不丟失已有的數據;
  • 任務重試:會有任務偶然失敗的場景,重試是最簡單的方式,但需要保證任務的執行時是冪等的;
  • 任務延時:延遲執行,比如 5 分鐘后給用戶發紅包;
  • 任務結果的臨時存儲,可用于儲存;
  • 任務處理情況監控:及時發現任務執行出錯情況;

對于 Python 來說,有個大名鼎鼎的 Celery(https://github.com/celery/celery),它完全包含上面的功能。它包含兩個比較重要的組件:一個是消息隊列,比如 Redis/RabbitMQ 等,Celery中叫做Broker,然后還需要有數據庫,用于存儲任務狀態,叫做Result Backend

顯然對于 Go 也有很多不錯的開源庫,其中一個學 Celery 的是 Machinery(github.com/RichardKnop/machinery),它目前能滿足大部分需求,而且一直在積極維護,也是我們團隊目前在用的。

它目前支持的 Broker 有 AMQP(RabbitMQ)、Redis、AWS SQS、GCP Pub/Sub,目前對國內同行來說,RabbitMQ 或者 Redis 會相對比較合適。

另外它還支持幾個高級用法:

  1. Groups:允許你定義多個并行的任務,在最后取任務結果的時候,可以一起返回;
  2. Chords:允許你定義一個回調任務,在 Group 任務執行完畢后執行對應的回調任務;
  3. Chains:允許你定義串行執行的任務,任務將會被串行執行;

說了優點,再說說它的缺點:

  1. 任務監控支持不夠,目前只有分布式追蹤 opentracing 的支持,假如我要使用 prometheus,會比較困難,它的自定義錯誤處理過于簡單,連上下文都不給你;
  2. 傳入的參數目前只支持非常簡單的參數,不支持 struct、map,還得定義參數的類型,這樣的方式會將這個庫限制在 Golang 世界中,而無法拓展適用于其它語言;

P.S.

其實對于 Goroutine 的方案,在以下兩種情況下,可以考慮使用:

  1. 必須同步返回給用戶請求結果;
  2. 服務器資源足夠,僅僅用 Worker pool 就能降低請求的響應時長到可接受范圍;

這兩種方案都會返回請求結果,失敗的情況下靠客戶端重新請求來解決數據丟失的問題。

原文標題:Golang 中的異步任務隊列

文章出處:【微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Channel
    +關注

    關注

    0

    文章

    31

    瀏覽量

    12131
  • 異步
    +關注

    關注

    0

    文章

    62

    瀏覽量

    18280
  • Worker
    +關注

    關注

    0

    文章

    8

    瀏覽量

    6564

原文標題:Golang 中的異步任務隊列

文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Spring Boot如何實現異步任務

    Spring Boot 提供了多種方式來實現異步任務,這里介紹三種主要實現方式。 1、基于注解 @Async @Async 注解是 Spring 提供的一種輕量級異步方法實現方式,它可以標記在方法上
    的頭像 發表于 09-30 10:32 ?1701次閱讀

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(一)

    TaskPool(任務池)和Worker的作用是為應用程序提供一個多線程的運行環境,用于處理耗時的計算任務或其他密集型任務。可以有效地避免這些任務
    發表于 03-25 14:11

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(二)

    易用,支持任務的執行、取消。工作線程數量上限為4。 Worker運作機制 圖2 Worker運作機制示意圖 創建Worker的線程稱為宿主線程(不一定是主線程,工作線程也支持創建
    發表于 03-26 15:25

    鴻蒙原生應用開發-ArkTS語言基礎類庫多線程TaskPool和Worker的對比(三)

    一、TaskPool注意事項 實現任務的函數需要使用裝飾器@Concurrent標注,且僅支持在.ets文件中使用。 實現任務的函數入參需滿足序列化支持的類型。 由于不同線程中上下文對象
    發表于 03-27 16:26

    TaskPool和Worker的對比分析

    。同個進程下,最多支持同時開啟8個Worker線程。 任務執行時長上限3分鐘(不包含Promise和async/await異步調用的耗時,例如網絡下載、文件讀寫等I/O任務的耗時)。無
    發表于 06-18 06:43

    CPU密集型任務開發指導

    密集型任務可以提高CPU利用率,提升應用程序響應速度。 當任務不需要長時間(3分鐘)占據后臺線程,而是一個個獨立的任務時,推薦使用TaskPool,反之推薦使用Worker。接下來將以
    發表于 06-19 06:05

    同步任務開發指導

    。 由于TaskPool偏向于單個獨立的任務,因此當各個同步任務之間相對獨立時推薦使用TaskPool,例如一系列導入的靜態方法,或者單例實現的方法。如果同步任務之間有關聯性,則需要使用Wor
    發表于 06-19 07:57

    HarmonyOS CPU與I/O密集型任務開發指導

    。 基于多線程并發機制處理CPU密集型任務可以提高CPU利用率,提升應用程序響應速度。 當進行一系列同步任務時,推薦使用Worker;而進行大量或調度點較為分散的獨立任務時,不方便使用
    發表于 09-26 16:29

    何用VxWorks的信號量機制實現任務同步

    何用VxWorks的信號量機制實現任務同步
    發表于 03-29 12:25 ?16次下載

    Android異步任務處理

    移動護理系統開發采用異步處理的方式,可以縮短執行操作的時間,避免UI線程阻塞。筆者介紹了采用異步處理方式開發移動護理程序的方法,并以移動護理中的病人列表異步任務處理為
    發表于 12-30 10:39 ?3804次閱讀

    詳解移動通信領域里的組POOL

    在移動通信領域,我們經常會提到Pool的概念。Pool,通常譯為水塘、水池。在移動通信中POOL通稱為“池”
    的頭像 發表于 03-19 16:15 ?8209次閱讀
    詳解移動通信領域里的組<b class='flag-5'>POOL</b>

    normal worker_pool詳細的創建過程代碼分析

    默認 work 是在 normal worker_pool 中處理的。系統的規劃是每個 CPU 創建兩個 normal worker_pool:一個 normal 優先級 (nice=0)、一個高
    的頭像 發表于 04-08 14:35 ?7704次閱讀
    normal <b class='flag-5'>worker_pool</b>詳細的創建過程代碼分析

    為何需要CMWQ?CMWQ如何解決問題的呢?

    基于這樣的思考,在CMWQ中,將這種固定的關系被打破,提出了worker pool這樣的概念(其實就是一種thread pool的概念),也就是說,系統中存在若干worker
    的頭像 發表于 08-20 14:47 ?5488次閱讀

    ModBus Pool下載

    ModBus Pool下載
    發表于 10-08 09:41 ?7次下載

    鴻蒙語言基礎類庫:ohos.worker 啟動一個Worker

    Worker是與主線程并行的獨立線程。創建Worker的線程稱之為宿主線程,Worker自身的線程稱之為Worker線程。創建Worker
    的頭像 發表于 07-11 17:03 ?753次閱讀
    鴻蒙語言基礎類庫:ohos.<b class='flag-5'>worker</b> 啟動一個<b class='flag-5'>Worker</b>
    主站蜘蛛池模板: 浮梁县| 江都市| 尉犁县| 梨树县| 上林县| 柞水县| 公主岭市| 福贡县| 英吉沙县| 怀安县| 金溪县| 青铜峡市| 榆树市| 盐城市| 龙泉市| 高州市| 江达县| 伊宁市| 清苑县| 泊头市| 宿迁市| 壶关县| 黄骅市| 新源县| 甘洛县| 义马市| 固镇县| 泊头市| 广汉市| 广宁县| 无极县| 黄龙县| 英山县| 皮山县| 鲁山县| 宁明县| 洛南县| 兴化市| 嘉义县| 肥城市| 马关县|