go并發模式之----工作池/協程池模式

常見模式之四:工作池/協程池模式

定義

顧名思義,就是有固定數量的工人(協程),去執行批量的任務

使用場景

  • 適用于需要限制并發執行任務數量的情況

  • 創建一個固定大小的 goroutine 池,將任務分發給池中的 goroutine 并等待它們完成,使用帶緩沖的通道來接收任務,以避免阻塞主線程

示例

有生產需求,建議使用大佬寫的?ants庫 ,以下是模擬協程池的簡單示例

假設,我們有固定數量(2個)工人執行批量(4個)任務

package mainimport ("fmt""sync"
)type Task struct {TaskFunc func() interface{}
}type WorkerPool struct {Size    intWg      *sync.WaitGroupTasks   chan TaskResults chan Result
}type Result struct {ID  intRes interface{}
}func NewWorkerPool(workerNum, taskBufSize int) *WorkerPool {return &WorkerPool{Size:    workerNum,Wg:      &sync.WaitGroup{},Tasks:   make(chan Task, taskBufSize),Results: make(chan Result, taskBufSize),}
}func (w *WorkerPool) AddTask(task Task) {w.Tasks <- task
}func (w *WorkerPool) Run() {for i := 1; i <= w.Size; i++ {w.Wg.Add(1)go func(id int) {defer w.Wg.Done()w.Work(id, w.Tasks, w.Results)}(i)}
}func (w *WorkerPool) Work(Id int, tasks chan Task, results chan Result) {for task := range tasks {results <- Result{ID:  Id,Res: task.TaskFunc(),}}
}func main() {pool := NewWorkerPool(3, 10)pool.Run()pool.AddTask(Task{TaskFunc: func() interface{} {return 2 * 3}})pool.AddTask(Task{TaskFunc: func() interface{} {return 4 * 5}})pool.AddTask(Task{TaskFunc: func() interface{} {return 6 * 7}})pool.AddTask(Task{TaskFunc: func() interface{} {return 8 * 9}})close(pool.Tasks)go func() {pool.Wg.Wait()close(pool.Results)}()for v := range pool.Results {fmt.Println(v.ID, v.Res)}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713096.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713096.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713096.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

順序表基礎

?錄 1. 課前準備 2. 順序表概念及結構 3. 順序表分類 4. 實現動態順序表 正?開始 課前預備 1. 課程?標 C語?語法基礎到數據結構與算法&#xff0c;前?已經掌握并具備了扎實的C語?基礎&#xff0c;為什么要學習數據結構 課程&#xff1f;?通訊錄項? 2. 需要…

小程序分賬方案:實現商戶分賬的簡便與靈活

隨著移動支付的普及和小程序的快速發展&#xff0c;越來越多的商家選擇在微信小程序上開展業務。然而&#xff0c;對于一些有多個分賬方的商戶而言&#xff0c;如何實現快速、準確和靈活的資金分賬成為了一個挑戰。本文將介紹一種高效的小程序分賬方案&#xff0c;幫助商戶輕松…

C++ STL 優先隊列(priority_queue)

1.優先隊列是一種極其特殊的隊列&#xff0c;他與標準的隊列使用線性結構進行計算不同&#xff0c;優先隊列的底層是以散列的狀態&#xff08;非線性&#xff09;表現的&#xff0c;他與標準的隊列有如下的區別&#xff0c;標準的隊列遵從嚴格的先進先出&#xff0c;優先隊列并…

負載均衡Ribbon和LoadBalancer

Ribbon和LoadBalancer都是用于實現負載均衡的工具&#xff0c;但它們在應用場景和實現方式上有所不同。 Ribbon 是一個客戶端負載均衡器&#xff0c;它是一個Java庫&#xff0c;可以在客戶端應用程序中使用。通過在客戶端應用程序中維護服務實例列表&#xff0c;并使用負載均衡…

修改docker默認存儲位置【高版本的docker】

一、修改docker默認存儲位置 1、停服務 systemctl stop docker 2、修改/etc/docker/daemon.json添加新的dcoker路徑 如"data-root": "/mnt/hdd1/docker" 3、保存后重啟服務&#xff1a;systemctl restart docker 二、其他服務的命令 systemctl disab…

AcWing 787. 歸并排序 解題思路及代碼

先貼個題目&#xff1a; 以及原題鏈接&#xff1a;787. 歸并排序 - AcWing題庫https://www.acwing.com/problem/content/789/純板子題&#xff0c;先貼代碼吧&#xff0c;根據代碼講思路&#xff1a; #include <iostream> using namespace std;const int N 1e5 10; in…

【Maven】Maven 基礎教程(三):build、profile

《Maven 基礎教程》系列&#xff0c;包含以下 3 篇文章&#xff1a; Maven 基礎教程&#xff08;一&#xff09;&#xff1a;基礎介紹、開發環境配置Maven 基礎教程&#xff08;二&#xff09;&#xff1a;Maven 的使用Maven 基礎教程&#xff08;三&#xff09;&#xff1a;b…

修飾符【C#】

分為四部分&#xff1a;屬性修飾符&#xff0c;存取修飾符&#xff0c;類修飾符和成員修飾符。 屬性修飾符&#xff1a; [Serializable]&#xff1a;按值將對象封送到遠程服務器。在按值封送對象時&#xff0c;就會創建一個該對象的副本&#xff0c;并將其序列化傳送到服務器…

TCP/UDP,HTTP、HTTPS存在什么風險會影響到網絡安全嗎

近年來&#xff0c;隨著網絡技術的飛速發展&#xff0c;互聯網影響人們的方方面面&#xff0c;我們平時也接觸到許多以前從未聽過的東西&#xff0c;今天德迅云安全就來分享下一些互聯網安全知識&#xff0c;講解一些關于常看到的關于IP, TCP/UDP&#xff0c;HTTP、HTTPS這些名…

QT之液晶電子時鐘

根據qt的<QLDNumber>做了一個qt液晶電子時鐘. 結果 實時顯示當前時間,左鍵可以拖動時鐘在屏幕的位置,右鍵點擊關閉顯示. 實現過程 新建一個class文件,讓這個文件的父類是QLCDNumber 相關功能變量定義和函數實現 .c文件代碼 這里需要注意的一點是event->button是獲取的…

SpringMVC自定義視圖解析器

/** * 使用View接口完成請求轉發|重定向 * 解釋: * SpringMVC的官方&#xff0c;提供了一個叫做View的接口&#xff0c;告訴開發人員 * DispatcherServlet底層會調用View接口的實例化對象中的邏輯方法 * 來完成對應的請求轉發和重定向。 * 使用: * 1. 單元方法的返回值為View接…

前臺自動化測試:基于敏捷測試驅動開發(TDD)的自動化測試原理

一、自動化測試概述 自動化測試主要應用到查詢結果的自動化比較&#xff0c;把借助自動化把相同的數據庫數據的相同查詢條件查詢到的結果同理想的數據進行自動化比較或者同已經保障的數據進行不同版本的自動化比較&#xff0c;減輕人為的重復驗證測試。多用戶并發操作需要自動…

【開源】JAVA+Vue.js實現APK檢測管理系統

目錄 一、摘要1.1 項目介紹1.2 項目錄屏 二、功能模塊2.1 數據中心模塊2.2 開放平臺模塊2.3 軟件檔案模塊2.4 軟件檢測模塊2.5 軟件舉報模塊 三、系統設計3.1 用例設計3.2 數據庫設計3.2.1 開放平臺表3.2.2 軟件檔案表3.2.3 軟件檢測表3.2.4 軟件舉報表 四、系統展示五、核心代…

pdfpages 宏包和 includepdf 使用問題

在 latex 中插入其他 pdf 文檔的頁時 \usepackage{pdfpages} % 插入 PDF 頁 \includepdf[pages-]{pg276-axi-hbm-en.pdf} 用 xelatex 編譯生成的 pdf 文檔內容會與原文檔內容不一致&#xff0c;文字位置對折等問題。 解決辦法&#xff1a; A 文檔中的某些…

springBoot整合Redis(二、RedisTemplate操作Redis)

Spring-data-redis是spring大家族的一部分&#xff0c;提供了在srping應用中通過簡單的配置訪問redis服務&#xff0c;對reids底層開發包(Jedis, JRedis, and RJC)進行了高度封裝&#xff0c;RedisTemplate提供了redis各種操作、異常處理及序列化&#xff0c;支持發布訂閱&…

Android:BitmapFactory.decodeStream Bitmap的內存優化OutOfMemory異常以后Crash閃退

自己項目中使用如下方法&#xff0c;有的手機上會奔潰報錯&#xff0c;原因是BitmapFactory.decodeStream部分沒有使用options參數改變內存大小 改成如下形式后正常了&#xff1b;正確解決方案&#xff1a;設置inSampleSize 一&#xff09;Android BitmapFactory.decodeStream(…

C++利用匯編挖掘編程語言的本質..

1.謬論 很多非一手的資料特別是中文資料其實并不可靠 因為很多作者都是直接通過轉載他人的作品 也不管他人作品真與假 而且有一部分的作品中的言論和官方描述相去甚遠 有的則是翻譯的過程中出現了問題 比如sizeof很多人認為是一個函數 其實他并不是一個函數 而是一個運算符 是…

【FAQ】HarmonyOS SDK 閉源開放能力 —Push Kit

1.問題描述 升級到4.0.0.59版本后&#xff0c;通過pushService.getToken獲取華為的token時報如下錯誤&#xff1a;Illegal application identity. 解決方案 Mate 40 Pro (NOH) 從 4.0升級到4.1版本后&#xff0c;會出現UDID變化&#xff0c;影響歷史的調試簽名使用&#xff…

檔案數字化驗收流程

檔案數字化驗收流程通常包括以下步驟&#xff1a; 1. 確定驗收標準&#xff1a;制定檔案數字化驗收標準&#xff0c;明確要求檢查的內容、質量要求、驗收標準等。 2. 準備驗收環境&#xff1a;為檔案數字化驗收準備合適的環境&#xff0c;包括驗收場所、設備、人員等。 3. 準備…

vscode 引入外部依賴包

背景 我要在vscode中寫一些antlr代碼生成的cpp代碼&#xff0c;但是在引入頭文件#include "antlr4-runtime.h"的時候&#xff0c;出現報錯&#xff0c;顯示沒有這個頭文件&#xff0c;顯然這是我們沒有導入相關的包&#xff0c;因此我首先嘗試了將antlr4的依賴源碼在…