Go 線程池實現案例

Go 語言并不像其他一些語言(例如 Java 或 C#)那樣直接提供一個線程池的概念。相反,Go 使用 goroutines 來實現并發,它是一種比線程更輕量級的并發執行單元。不過,仍然可以實現一個類似線程池的結構,來管理和限制同時運行的 goroutines 的數量。以下是如何在 Go 中實現一個簡單的類似線程池的功能的例子:

package mainimport ("fmt""sync""time"
)// WorkerPool 結構體定義
type WorkerPool struct {jobs    chan func()   // 用于接收任務的通道maxJobs int           // 最大并發任務數wg      sync.WaitGroup // 用于等待所有任務完成
}// NewWorkerPool 創建一個新的 WorkerPool
func NewWorkerPool(maxJobs int) *WorkerPool {pool := &WorkerPool{jobs:    make(chan func(), maxJobs),maxJobs: maxJobs,}return pool
}// Start 開始 WorkerPool 的工作
func (p *WorkerPool) Start() {for i := 0; i < p.maxJobs; i++ {go func() {for job := range p.jobs {job()}}()}
}// Submit 提交一個任務到 WorkerPool
func (p *WorkerPool) Submit(job func()) {p.wg.Add(1)p.jobs <- func() {defer p.wg.Done()job()}
}// Wait 等待所有任務完成
func (p *WorkerPool) Wait() {p.wg.Wait()close(p.jobs) // 關閉通道,停止接收新的任務
}func main() {// 創建一個最大并發數為 3 的工作池pool := NewWorkerPool(3)pool.Start()for i := 0; i < 10; i++ {i := i // 創建任務變量的本地副本pool.Submit(func() {fmt.Printf("Starting job %d\n", i)time.Sleep(2 * time.Second) // 模擬耗時操作fmt.Printf("Finished job %d\n", i)})}// 等待所有任務完成pool.Wait()fmt.Println("All jobs completed.")
}

在這個例子中,WorkerPool 結構體有一個 jobs 通道用于接收任務,一個 maxJobs 表示最大并發任務數,和一個 sync.WaitGroup 用于等待所有任務完成。Start 方法啟動了 maxJobs 數量的 goroutines,每個 goroutine 不斷地從 jobs 通道中接收并執行任務。Submit 方法用于提交新的任務到 jobs 通道,同時增加 WaitGroup 的計數。Wait 方法等待所有任務完成后關閉 jobs 通道。

main 函數中,創建了一個最大并發數為 3 的 WorkerPool,提交了 10 個任務,然后調用 Wait 方法等待所有任務完成。

這個簡單的 WorkerPool 實現可以控制同時運行的 goroutines 數量,從而類似于其他語言中的線程池概念。當然,根據實際需求,你可以擴展和定制這個 WorkerPool 的實現,例如添加任務的優先級、錯誤處理、任務結果的收集等功能。

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

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

相關文章

studio one 6正版多少錢?怎么購買studio one 更便宜,有優惠券哦

Presonus Studio One Studio One是由美國PreSonus公司開發的數字音頻工作站&#xff0c;作為DAW屆的新人&#xff0c;功能強大且全面&#xff0c;雖然它不像其他DAW那樣擁有歷史和聲譽&#xff0c;但它是一個可愛的軟件&#xff0c;包含許多其它DAW所不具備的實用功能&#xff…

web基礎及http協議 (二)----------Apache相關配置與優化

一、httpd 安裝組成 http 服務基于 C/S 結構 1 .常見http 服務器程序 httpd apache&#xff0c;存在C10K&#xff08;10K connections&#xff09;問題 nginx 解決C10K問題lighttpd IIS .asp 應用程序服務器 tomcat .jsp 應用程序服務器 jetty 開源的servlet容器&#xf…

選擇 Python IDE(VSCode、Spyder、Visual Studio 2022和 PyCharm)

前言 當選擇 Python 開發工具時&#xff0c;你需要考慮自己的需求、偏好和項目類型。下面是對VSCode、Spyder、Visual Studio 2022和 PyCharm的對比推薦總結&#xff1a; 結論 1、如果你專注于“數據科學”&#xff0c;選擇SpyDer沒錯。 內容 Visual Studio Code (VS Code)…

react項目中的redux以及react-router-dom

掃盲知識點&#xff1a; 1 傳遞自定義事件&#xff1a; <button onClick{(e)>{change(e)}}>獲取事件對象e</button> 將事件對象e傳遞到了change的這個方法中。 2 同時傳遞自定義事件和參數&#xff1a; <button onClick{(e)>{change(‘我…

基于微信小程序失物招領系統設計與實現(PHP后臺+Mysql)可行性分析

博主介紹&#xff1a;黃菊華老師《Vue.js入門與商城開發實戰》《微信小程序商城開發》圖書作者&#xff0c;CSDN博客專家&#xff0c;在線教育專家&#xff0c;CSDN鉆石講師&#xff1b;專注大學生畢業設計教育和輔導。 所有項目都配有從入門到精通的基礎知識視頻課程&#xff…

CleanMyMac2024蘋果電腦清理工具最新使用全面評價

作為軟件評價專家&#xff0c;我對CleanMyMac X進行了全面的評估&#xff0c;以下是我的詳細評價&#xff1a; CleanMyMac X4.14.6全新版下載如下: https://wm.makeding.com/iclk/?zoneid49983 一、功能 CleanMyMac X的功能相當全面&#xff0c;幾乎涵蓋了Mac電腦清理所需的…

nginx 具體介紹

一&#xff0c;nginx 介紹 &#xff08;一&#xff09;nginx 與apache 1&#xff0c; Apache event 模型 相對于 prefork 模式 可以同時處理更多的請求 相對于 worker 模式 解決了keepalive場景下&#xff0c;長期被占用的線程的資源浪費問題 因為有監聽線程&#…

【數據結構】鏈式隊列

鏈式隊列實現&#xff1a; 1.創建一個空隊列 2.尾插法入隊 3.頭刪法出隊 4.遍歷隊列 一、main函數 #include <stdio.h> #include "./3.linkqueue.h" int main(int…

文檔控件DevExpress Office File API v23.2新版亮點 - 支持SVG

DevExpress Office File API是一個專為C#, VB.NET 和 ASP.NET等開發人員提供的非可視化.NET庫。有了這個庫&#xff0c;不用安裝Microsoft Office&#xff0c;就可以完全自動處理Excel、Word等文檔。開發人員使用一個非常易于操作的API就可以生成XLS, XLSx, DOC, DOCx, RTF, CS…

數據結構之單鏈表的操作

main函數 #include <stdio.h> #include "./03_linkList.h" int main(int argc, const char *argv[]) { linkList* head creatr_linkList(); insertHead_linkL…

運維SRE-19 網站Web中間件服務-http-nginx

Ans自動化流程 1.網站集群核心協議&#xff1a;HTTP 1.1概述 web服務&#xff1a;網站服務&#xff0c;網站協議即可. 協議&#xff1a;http協議,https協議 服務&#xff1a;Nginx服務&#xff0c;Tengine服務....1.2 HTTP協議 http超文本傳輸協議&#xff0c;負責數據在網站…

更高效的構建工具-vite

更高效的構建工具-vite 前言Vite是什么Vite和webpack的比較1. 運行原理2. 使用成本 Vite的初體驗 前言 首先我們要認識什么時構建工具&#xff1f; 企業級項目都具備什么功能呢&#xff1f; Typescript&#xff1a;如果遇到ts文件&#xff0c;我們需要使用tsc將typescript代碼…

Android約束布局中用ConstraintHelper實現過渡動畫效果

前些天發現了一個蠻有意思的人工智能學習網站,8個字形容一下"通俗易懂&#xff0c;風趣幽默"&#xff0c;感覺非常有意思,忍不住分享一下給大家。 &#x1f449;點擊跳轉到教程 一.創建一個類CircularRevealHelper繼承ConstraintHelper代碼如下 /*** Author: ly* Da…

【Linux從青銅到王者】 基礎IO

本篇重點&#xff1a;文件描述符&#xff0c;重定向&#xff0c;緩沖區&#xff0c;磁盤結構&#xff0c;文件系統&#xff0c;inode理解文件的增刪查改&#xff0c;查找一個文件為什么一定要有路徑&#xff0c;動靜態庫&#xff0c;有的時候為什么找不到庫&#xff0c;動態庫的…

JavaWeb——003Axios Vue組件庫(Element)

目錄 一、Ajax 1、同步與異步?編輯 2、原生Ajax&#xff08;繁瑣&#xff09;?編輯 2.1、寫一個簡易的Ajax 3、Axios&#xff08;推薦使用&#xff09;?編輯 3.1、Axios入門 3.2、Axios請求方式別名 3.3、案例&#xff1a;基于Vue及Axios完成數據的動態加載展示?編…

Flink CDC 3.0 表結構變更時導致webUI接口無反應原因

Flink CDC 3.0 表結構變更時導致webUI接口無反應&#xff01; 原因&#xff1a;因為deliverCoordinationRequestToCoordinator和requestJob都是SchedulerNG中方法&#xff0c;該類的線程模型是單線程執行&#xff0c;所以在deliverCoordinationRequestToCoordinator執行表結構…

mysql創建數據庫,用戶授權

一、創建用戶 CREATE USER 用戶名% IDENTIFIED BY 密碼; flush privileges; 二、更新用戶密碼 update mysql.user set authentication_stringpassword("密碼") where userroot; flush privileges; 三、允許root遠程登錄 update user set host % where user r…

AIoT網關 人工智能物聯網網關

AIoT(人工智能物聯網)作為新一代技術的代表&#xff0c;正以前所未有的速度改變著我們的生活方式。在這個智能時代&#xff0c;AIoT網關的重要性日益凸顯。它不僅是連接智能設備和應用的關鍵&#xff0c;同時也是實現智能化家居、智慧城市和工業自動化的必備技術。      一…

c# entity freamwork 判斷是否存在

在 Entity Framework (EF) 中&#xff0c;你可以使用 LINQ 查詢來判斷數據庫中是否存在特定條件的記錄。以下是一些常見的方法&#xff1a; 使用 Any 方法: using (var context new YourDbContext()) {bool exists context.YourEntity.Any(e > e.Property yourValue);i…

【linux進程間通信(二)】共享內存詳解以及進程互斥概念

&#x1f493;博主CSDN主頁:杭電碼農-NEO&#x1f493; ? ?專欄分類:Linux從入門到精通? ? &#x1f69a;代碼倉庫:NEO的學習日記&#x1f69a; ? &#x1f339;關注我&#x1faf5;帶你學更多操作系統知識 ? &#x1f51d;&#x1f51d; 進程間通信 1. 前言2. 共享內…