最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go 并發(fā)控制利器 ants 使用方法與實(shí)踐

 更新時(shí)間:2026年07月08日 09:28:59   作者:言之。  
ants是一個(gè)高效的Go語言goroutine池實(shí)現(xiàn),通過復(fù)用已完成任務(wù)的goroutine來減少資源開銷并限制并發(fā)數(shù)量,本文就來詳細(xì)的介紹一下Go 并發(fā)控制利器 ants的使用,感興趣的可以了解一下

1.ants基礎(chǔ)應(yīng)用

https://github.com/panjf2000/ants

1.1 什么是ants

ants 是一個(gè)高性能的 Go 語言 goroutine 池,它能復(fù)用已完成任務(wù)的 goroutine,避免頻繁創(chuàng)建和銷毀 goroutine,節(jié)省 CPU 與內(nèi)存開銷,并且能限制并發(fā)數(shù)量防止資源被耗盡。

1.2 安裝

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

1.3 最簡(jiǎn)單的例子

package main

import (
	"fmt"
	"time"

	"github.com/panjf2000/ants/v2"
)

func main() {
	// 創(chuàng)建一個(gè)容量為 10 的 goroutine 池
	pool, _ := ants.NewPool(10)
	defer pool.Release() // 程序結(jié)束釋放資源

	// 提交任務(wù)
	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) // 等待任務(wù)執(zhí)行完
}

特點(diǎn):

  • 同時(shí)最多只有 10 個(gè)任務(wù)運(yùn)行。
  • 其余任務(wù)排隊(duì)等待空閑 worker。

2. 進(jìn)階篇

2.1 核心 API

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

2.2 常用配置項(xiàng)

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

2.3PoolWithFunc用法

package main

import (
	"fmt"
	"github.com/panjf2000/ants/v2"
	"time"
)

func main() {
	// 定義處理函數(shù)
	handler := func(data interface{}) {
		fmt.Printf("Processing: %v\n", data)
		time.Sleep(time.Millisecond * 500)
	}

	// 創(chuàng)建綁定函數(shù)的池
	pool, _ := ants.NewPoolWithFunc(5, handler)
	defer pool.Release()

	for i := 0; i < 10; i++ {
		_ = pool.Invoke(i) // 直接傳參數(shù)
	}
}

3. 實(shí)戰(zhàn)篇

3.1 批量任務(wù)執(zhí)行

場(chǎng)景:你需要批量處理 10000 條數(shù)據(jù),但不希望一次性開 10000 個(gè) goroutine。

package main

import (
	"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.WaitGroup
	pool, _ := ants.NewPool(50) // 控制并發(fā)為 50
	defer 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 并發(fā)控制

爬取多個(gè) URL,但限制同時(shí)請(qǐng)求的數(shù)量。

package main

import (
	"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.WaitGroup
	pool, _ := 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. 最佳實(shí)踐與注意事項(xiàng)

  1. 適合長(zhǎng)時(shí)間運(yùn)行的服務(wù)

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

    • 單個(gè)任務(wù)阻塞會(huì)占用 worker,影響吞吐量。
  3. panic 處理必須配置

    • 避免單個(gè)任務(wù)導(dǎo)致池崩潰。
  4. 選擇合適的池大小

    • 一般為 CPU核數(shù) * N,N 根據(jù) IO 密集度調(diào)整。
  5. 性能對(duì)比

    • 對(duì)于少量任務(wù),直接開 goroutine 可能更快;
    • 對(duì)于大規(guī)模并發(fā),ants 會(huì)明顯減少 GC 壓力。

到此這篇關(guān)于Go 并發(fā)控制利器 ants 使用文檔的文章就介紹到這了,更多相關(guān)Go 并發(fā)控制利器 ants內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

  • Go語言中字符串賦值中的問題與解決方法

    Go語言中字符串賦值中的問題與解決方法

    這篇文章主要為大家詳細(xì)介紹了Go語言中字符串賦值會(huì)出現(xiàn)的一些問題以及解決方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2024-12-12
  • Golang中tinyrpc框架的源碼解讀詳解

    Golang中tinyrpc框架的源碼解讀詳解

    tinyrpc是一個(gè)高性能的基于protocol?buffer的rpc框架。項(xiàng)目代碼非常少,很適合初學(xué)者進(jìn)行g(shù)olang的學(xué)習(xí)。本文將從源碼的角度帶大家了解tinyrpc框架的使用,需要的可以參考一下
    2023-01-01
  • goland 實(shí)現(xiàn)自動(dòng)格式化代碼

    goland 實(shí)現(xiàn)自動(dòng)格式化代碼

    這篇文章主要介紹了goland 實(shí)現(xiàn)自動(dòng)格式化代碼的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解

    Go基礎(chǔ)教程系列之import導(dǎo)入包(遠(yuǎn)程包)和變量初始化詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之import導(dǎo)包和初始化詳解,需要的朋友可以參考下
    2022-04-04
  • GoLang channel底層代碼實(shí)現(xiàn)詳解

    GoLang channel底層代碼實(shí)現(xiàn)詳解

    Channel和goroutine的結(jié)合是Go并發(fā)編程的大殺器。而Channel的實(shí)際應(yīng)用也經(jīng)常讓人眼前一亮,通過與select,cancel,timer等結(jié)合,它能實(shí)現(xiàn)各種各樣的功能。接下來,我們就要梳理一下GoLang channel底層代碼實(shí)現(xiàn)
    2022-10-10
  • Go標(biāo)準(zhǔn)庫之Requests的介紹與基本使用

    Go標(biāo)準(zhǔn)庫之Requests的介紹與基本使用

    Python中的Requests庫非常強(qiáng)大,所以Go開發(fā)者模仿Python的Requests庫,由此誕生了Grequests庫,本文主要介紹了Requests的基本使用,有需要的可以參考下
    2024-04-04
  • 15個(gè)Golang中時(shí)間處理的實(shí)用函數(shù)

    15個(gè)Golang中時(shí)間處理的實(shí)用函數(shù)

    在Go編程中,處理日期和時(shí)間是一項(xiàng)常見任務(wù),涉及到精確性和靈活性,本文將介紹一系列實(shí)用函數(shù),它們充當(dāng)time包的包裝器,需要的可以參考下
    2024-01-01
  • 淺談GoLang幾種讀文件方式的比較

    淺談GoLang幾種讀文件方式的比較

    這篇文章主要介紹了淺談GoLang幾種讀文件方式的比較,一般來說常用的有三種。使用Read加上buffer,使用bufio庫和ioutil 庫,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2019-01-01
  • Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解

    Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解

    這篇文章主要介紹了Go基礎(chǔ)教程系列之WaitGroup用法實(shí)例詳解,需要的朋友可以參考下
    2022-04-04
  • 最新評(píng)論

    汝城县| 融水| 福安市| 句容市| 永州市| 三门峡市| 钦州市| 清丰县| 宁蒗| 德格县| 溧水县| 镇原县| 红桥区| 伊川县| 广汉市| 友谊县| 鄄城县| 莱阳市| 龙山县| 鹤峰县| 吉首市| 张家界市| 鄂伦春自治旗| 昌江| 鄂托克旗| 友谊县| 拜城县| 鄂尔多斯市| 罗平县| 平乡县| 巴楚县| 济宁市| 永泰县| 全州县| 同江市| 西青区| 龙山县| 肃宁县| 广元市| 乡宁县| 习水县|