golang线程池ants-四种使用方法
package main
import (
"fmt"
"sync"
"sync/atomic"
"time"
"github.com/panjjo/ants/v1"
)
// 示例一:并发地执行一个简单的函数。
func demo1() {
// 创建一个ants池,并发量为5
p, _ := ants.NewPool(5)
// 创建一个任务
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
_ = p.Submit(func() {
defer wg.Done()
fmt.Println("Hello, Ants!")
})
}
wg.Wait()
// 关闭池子,等待所有正在处理的任务完成后,才退出
p.Release()
}
// 示例二:使用ants池执行有状态的任务。
func demo2() {
p, _ := ants.NewPool(5)
var n int32
for i := 0; i < 10; i++ {
_ = p.Submit(func() {
atomic.AddInt32(&n, 1)
})
}
time.Sleep(time.Second) // 等待所有任务执行完成
fmt.Printf("Running tasks: %d\n", n)
p.Release()
}
// 示例三:使用ants池执行需要用到任务参数的任务。
func demo3() {
p, _ := ants.NewPool(5)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
_ = p.Submit(func(args ...interface{}) {
defer wg.Done()
fmt.Printf("Hello, Ants! Argument: %d\n", args[0])
}, i)
}
wg.Wait()
p.Release()
}
// 示例四:使用ants池执行有超时处理的任务。
func demo4() {
p, _ := ants.NewPool(5)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
_ = p.SubmitWithError(func() error {
defer wg.Done()
time.Sleep(2 * time.Second)
fmt.Println("Hello, Ants!")
return nil
})
}
wg.Wait()
p.Release()
}
func main() {
demo1()
demo2()
demo3()
demo4()
}
这个代码示例展示了如何使用ants
包创建并使用不同类型的并发池。每个示例都创建了一个并发池,提交任务,并在适当的时候关闭池子。示例四还展示了如何处理可能发生的错误。
评论已关闭