Go 并發控制利器 ants 使用文檔

https://github.com/panjf2000/ants

在這里插入圖片描述

1.1 什么是 ants

ants 是一個高性能的 Go 語言 goroutine 池,它能復用已完成任務的 goroutine,避免頻繁創建和銷毀 goroutine,節省 CPU 與內存開銷,并且能限制并發數量防止資源被耗盡。

1.2 安裝

go get -u github.com/panjf2000/ants/v2

1.3 最簡單的例子

package mainimport ("fmt""time""github.com/panjf2000/ants/v2"
)func main() {// 創建一個容量為 10 的 goroutine 池pool, _ := ants.NewPool(10)defer pool.Release() // 程序結束釋放資源// 提交任務for i := 0; i < 20; i++ {n := i_ = pool.Submit(func() {fmt.Printf("Task %d running\n", n)time.Sleep(time.Second)})}fmt.Println("All tasks submitted")time.Sleep(3 * time.Second) // 等待任務執行完
}

特點:

  • 同時最多只有 10 個任務運行。
  • 其余任務排隊等待空閑 worker。

2. 進階篇

2.1 核心 API

方法作用
ants.NewPool(size, options...)創建一個普通任務池
ants.NewPoolWithFunc(size, func, options...)創建一個綁定任務處理函數的池
Submit(task)提交任務到池
Invoke(param)提交參數,調用綁定函數
Running()當前正在運行的 worker 數量
Free()當前空閑 worker 數量
Cap()池容量
Tune(size)動態調整容量
Release()釋放所有資源
Reboot()重啟一個已釋放的池

2.2 常用配置項

ants.WithPreAlloc(true)           // 預先分配內存,減少運行時分配
ants.WithNonblocking(true)        // worker 不夠時立即返回錯誤,而不是等待
ants.WithMaxBlockingTasks(1000)   // 最大等待任務數
ants.WithPanicHandler(func(err interface{}) {fmt.Println("panic:", err)     // 捕獲任務中的 panic
})
ants.WithExpiryDuration(time.Second * 10) // 空閑 worker 過期時間

2.3 PoolWithFunc 用法

package mainimport ("fmt""github.com/panjf2000/ants/v2""time"
)func main() {// 定義處理函數handler := func(data interface{}) {fmt.Printf("Processing: %v\n", data)time.Sleep(time.Millisecond * 500)}// 創建綁定函數的池pool, _ := ants.NewPoolWithFunc(5, handler)defer pool.Release()for i := 0; i < 10; i++ {_ = pool.Invoke(i) // 直接傳參數}
}

3. 實戰篇

3.1 批量任務執行

場景:你需要批量處理 10000 條數據,但不希望一次性開 10000 個 goroutine。

package mainimport ("fmt""sync""time""github.com/panjf2000/ants/v2"
)func processTask(id int) {fmt.Printf("Task %d start\n", id)time.Sleep(time.Second)fmt.Printf("Task %d done\n", id)
}func main() {var wg sync.WaitGrouppool, _ := ants.NewPool(50) // 控制并發為 50defer pool.Release()for i := 0; i < 10000; i++ {wg.Add(1)taskID := i_ = pool.Submit(func() {defer wg.Done()processTask(taskID)})}wg.Wait()
}

3.2 HTTP 并發控制

爬取多個 URL,但限制同時請求的數量。

package mainimport ("fmt""net/http""sync""github.com/panjf2000/ants/v2"
)func fetch(url string) {resp, err := http.Get(url)if err != nil {fmt.Println(err)return}defer resp.Body.Close()fmt.Println(url, resp.StatusCode)
}func main() {urls := []string{"https://golang.org","https://github.com","https://google.com",}var wg sync.WaitGrouppool, _ := ants.NewPool(5)defer pool.Release()for _, url := range urls {wg.Add(1)u := url_ = pool.Submit(func() {defer wg.Done()fetch(u)})}wg.Wait()
}

4. 最佳實踐與注意事項

  1. 適合長時間運行的服務

    • 在任務密集的服務中能顯著降低內存占用。
  2. 任務不宜過大或阻塞太久

    • 單個任務阻塞會占用 worker,影響吞吐量。
  3. panic 處理必須配置

    • 避免單個任務導致池崩潰。
  4. 選擇合適的池大小

    • 一般為 CPU核數 * N,N 根據 IO 密集度調整。
  5. 性能對比

    • 對于少量任務,直接開 goroutine 可能更快;
    • 對于大規模并發,ants 會明顯減少 GC 壓力。

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

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

相關文章

Day57--圖論--53. 尋寶(卡碼網)

Day57–圖論–53. 尋寶&#xff08;卡碼網&#xff09; 今天學習&#xff1a;最小生成樹。有兩種算法&#xff08;Prim和Kruskal&#xff09;和一道例題。 prim 算法是維護節點的集合&#xff0c;而 Kruskal 是維護邊的集合。 最小生成樹&#xff1a;所有節點的最小連通子圖&am…

解決海洋探測數據同步網絡問題的新思路——基于智能組網技術的探索

隨著海洋探測技術的不斷發展&#xff0c;數據同步網絡的穩定性和低延遲需求變得愈發重要。海洋探測數據來自多個分布式采集點&#xff0c;這些點需要高效的組網方式來實現實時數據傳輸。然而&#xff0c;由于海洋環境的特殊性&#xff08;如復雜的網絡拓撲、高濕度和極端溫度&a…

設計模式筆記_行為型_責任鏈模式

1. 責任鏈模式介紹責任鏈模式&#xff08;Chain of Responsibility&#xff09;是一種行為設計模式&#xff0c;它允許將多個處理器&#xff08;處理對象&#xff09;連接成一條鏈&#xff0c;并沿著這條鏈傳遞請求&#xff0c;直到有一個處理器處理它為止。職責鏈模式的主要目…

pygame的幀處理中,涉及鍵盤的有`pg.event.get()`與`pg.key.get_pressed()` ,二者有什么區別與聯系?

一、pg.event.get() 返回的是一組事件 pg.event.get() 返回的是一組事件&#xff08;一個包含多個事件對象的列表&#xff09;。這是因為在游戲的“一幀”時間內&#xff08;通常1/60秒左右&#xff09;&#xff0c;用戶可能會觸發多個事件&#xff08;比如同時按下多個鍵、快速…

TF - IDF算法面試與工作常見問題全解析

在自然語言處理領域&#xff0c;TF - IDF算法是一個基礎且重要的概念。無論是在求職面試還是在實際工作中&#xff0c;都經常會遇到與TF - IDF相關的問題。以下是一些常見的問題及其詳細解答&#xff1a; 一、基本概念類問題 1. 什么是TF - IDF算法&#xff1f; TF - IDF&#…

Transformer網絡結構解析

博主會經常分享自己在人工智能階段的學習筆記&#xff0c;歡迎大家訪問我滴個人博客&#xff01;&#xff08;都不白來&#xff01;&#xff09; 小牛壯士 - 個人博客https://kukudelin.top/ 前言 Transformer 廣泛應用于自然語言處理&#xff08;如機器翻譯、文本生成&…

gateway進行接口日志打印

打印需求&#xff1a;對所有的接口打印&#xff1a;請求方式&#xff0c;請求路徑&#xff0c;請求參數&#xff0c;用戶id&#xff0c;訪問IP&#xff0c;訪問時間對增刪改操作的接口打印&#xff1a;接口響應打印方案&#xff1a;給GET設置一個白名單&#xff08;因為get請求…

MATLAB實現圖像增強(直方圖均衡化)

直方圖均衡化是一種常用的圖像增強技術&#xff0c;它通過重新分布圖像的像素強度值來增強圖像的對比度。以下是MATLAB中實現直方圖均衡化的詳細方法。%% 直方圖均衡變換 clc;close all;clear all;warning off;%清除變量 rand(seed, 100); randn(seed, 100); format long g;%% …

java15學習筆記-密封類

360:Sealed Classes (Preview) 封閉類&#xff08;預覽&#xff09; 總結 使用密封類和接口增強Java編程語言。密封類和接口限制了哪些其他類或接口可以擴展或實現它們。這是JDK 15中的預覽語言功能。 目標 允許類或接口的作者控制負責實現它的代碼。 提供一種比訪問…

西門子PLC通過穩聯技術EtherCAT轉Profinet網關連接baumuller伺服器的配置案例

西門子PLC用穩聯技術的EtherCAT轉Profinet網關&#xff0c;連上baumuller伺服器的配置例子本案例實現西門子S71200 PLC通過EtherCAT轉Profinet網關對baumuller&#xff08;Baumller&#xff09;伺服器的實時控制&#xff0c;適用于高精度運動控制場景&#xff08;如精密機床、自…

Ansible 詳細筆記

Ansible 詳細筆記 一、Ansible 基礎概述 1.1 定義與定位 Ansible 是由 Red Hat 主導開發的開源自動化運維工具&#xff0c;基于 Python 語言實現&#xff0c;專注于簡化 IT 基礎設施的配置管理、應用部署、任務編排等操作。它采用無代理架構&#xff0c;通過 SSH 協議與被控節點…

【Java 后端】Spring Boot 集成 JPA 全攻略

Spring Boot 集成 JPA 全攻略 一、前言 在 Java Web 開發中&#xff0c;數據庫訪問是繞不開的話題。 傳統方式使用 JDBC 編寫 SQL&#xff0c;維護困難、可讀性差。后來有了 MyBatis 這種半自動 ORM 框架&#xff0c;再到 JPA&#xff08;Java Persistence API&#xff09;這…

pytorch學習筆記-加載現有的網絡模型(VGG16)、增加/修改其中的網絡層(修改為10分類)

寫在前面&#xff1a;有些地方和視頻里不一樣的是因為官方文檔更新了&#xff0c;一些參數用法不一樣也很正常&#xff0c;包括我現在的也是我這個時間節點最新的&#xff0c;誰知道過段時間會不會更新呢 建議大家不要一味看視頻/博客&#xff0c;多看看官方文檔才是正道&#…

RocketMQ 4.9.3源碼解讀-NameServer組件啟動流程分析

作者源碼閱讀筆記主要采用金山云文檔記錄的,所有的交互圖和代碼閱讀筆記都是記錄在云文檔里面,本平臺的文檔編輯實在不方便,會導致我梳理的交互圖和文檔失去原來的格式,所以整理在文檔里面,供大家閱讀交流 【金山文檔 | WPS云文檔】 namesrv 啟動流程 相關重要類介紹說明…

《嵌入式 C 語言編碼規范與工程實踐個人筆記》參考華為C語言規范標準

《嵌入式 C 語言編碼規范與工程實踐個人筆記》參考華為C語言規范標準 前言 在電子系統開發領域&#xff0c;C 語言作為底層開發的核心語言&#xff0c;其代碼質量直接關系到系統的穩定性、可維護性和擴展性。良好的編碼規范不僅是團隊協作的基礎&#xff0c;更是降低生命周期成…

純半精度模型和全精度模型的耗時分別為248微秒和1400微秒。混合精度模型371微秒比原始模型快大約四倍!

不過有一點需要注意:在上下文管理器內部生成的任何輸出,必然會采用該上下文管理器的數據類型。因此,之后我們必須將這些輸出轉換回FP32(例如,使用float()函數)。 with torch.autocast(device_type="cuda", dtype=torch.float16): res16 = mixed32(torch.randn…

一款開源的遠程桌面軟件,旨在為用戶提供流暢的游戲體驗,支持 2K 分辨率、60 FPS,延遲僅為 40ms。

軟件介紹 CloudPlayPlus&#xff08;云玩加&#xff09;是一款令人驚艷的開源遠程桌面、串流軟件&#xff0c;云玩加由個人開發者開發者&#xff0c;具有四大特征&#xff1a;開源、免費、低延遲、安全。 軟件使用 客戶端支持多個平臺&#xff0c;包括 Windows、Mac OS、安卓…

MySql——binlog和redolog的區別

目錄一、binlog和redolog的區別一、binlog和redolog的區別 binlog和redolog都是存儲修改的新數據&#xff0c;是否保留binlog和redolog中的一個即可。 binlog屬于整個mysql&#xff0c;是所有引擎共用的&#xff0c;不是只屬于innoDB引擎。而redolog屬于InnoDB存儲引擎。binlo…

軟件著作權產生與登記關鍵點

知識講解一、 軟件著作權的核心特征與權利內容自動產生原則&#xff1a; 這是軟件著作權最核心、最重要的特征。產生時間&#xff1a; 軟件著作權自軟件開發完成之日起自動產生。法律依據&#xff1a; 《中華人民共和國著作權法》第二條及《計算機軟件保護條例》第五條明確規定…

什么是主成分分析(PCA)和數據降維

主成分分析&#xff08;PCA&#xff09;和數據降維是機器學習和統計學中處理高維數據的核心工具。下面用清晰的結構解釋其概念、原理和應用&#xff1a; 一、數據降維&#xff08;Dimensionality Reduction&#xff09; 1. 是什么&#xff1f; 目標&#xff1a;將高維數據&…