go ants使用
NewPoolWithFunc -> func(data interface{}) -> data.(Task) -> Task.Do
上面的这些函数都是同步的,添加到 NewPoolWithFunc中后,执行 invoke会变成异步
NewPool和NewPoolWithFunc本质是一样的,都是一个 anonymous function
参考demo,人家的代码抽象能力比我强得多
func main() {
p, _ := ants.NewPoolWithFunc(10, taskFunc)
defer p.Release()
p.Invoke()
}
// 直接添加到goroutine的函数
func taskFunc(data interface{}) {
task := data.(*Task)
task.Do()
fmt.Printf("task:%d sum:%d\n", task.index, task.sum)
}
// 对并发任务的抽象
type Task struct {
index int
nums []int
sum int
wg *sync.WaitGroup
}
func (t *Task) Do() {
for _, num := range t.nums {
t.sum += num
}
t.wg.Done()
}
我后面重新写了一个版本
使用ants库控制并发数量
基本用法:
package main
import (
"app/util"
"fmt"
"github.com/panjf2000/ants/v2"
"sync"
"time"
)
func doTask(index int) {
fmt.Printf("正在执行任务: %v/%v\n", index, taskNum)
time.Sleep(3 * time.Second)
wg.Done()
}
const taskNum = 10
const poolSize = 3
var wg = new(sync.WaitGroup)
func main() {
pool, _ := ants.NewPool(poolSize)
defer pool.Release()
defer util.CalTime()()
for i := 0; i < taskNum; i++ {
i := i
err := pool.Submit(func() {
wg.Add(1)
doTask(i)
})
if err != nil {
fmt.Println("发生错误:", err)
return
}
}
wg.Wait()
fmt.Println("所有任务全部完成")
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人