注意
1.线程池执行有两种,一种执行普通逻辑方法pool,可接受所有方法,另一种执行形同类型的方法(就是每次接收的内容方法都一样)
2.使用前需要先建立一个对应的pool对象,参数是容量大小和过期时间等, 如果使用普通方法,有默认方法可以使用。这里不同的时,普通的pool需要每次都传入不同的逻辑函数,而同类的pool只需要第一次传入函数,然后后续传参即可,效率大大提高,不过使用没那么广,各有利弊,自己选择使用。
3.使用后,需要调用Release来结束使用,意思就是close那类的意思
4.注意error的处理,这里为了测试没有做error的处理,这些过程需要自我完善
总的来说,使用过程就是,第一步:新建对象,第二步:加入逻辑函数代码,第三步:结束使用关闭对象。
例子
自己单独测试代码时,需要注意这里使用sync.WaitGroup是为了看出结果,阻塞主线程,防止直接停止,如果在web项目中,本身就不会直接退出,就不需要,不过也可以酌情思考。
//注意
//线程池执行有两种,一种执行普通逻辑方法pool,可接受所有方法,另一种执行形同类型的方法(就是每次接收的内容方法都一样)
//使用前需要先建立一个对应的pool对象,参数是容量大小和过期时间等, 如果使用普通方法,有默认方法可以使用
//使用后,需要调用Release来结束使用,意思就是close那类的意思
//总的来说,使用过程就是,新建对象,加入逻辑函数代码,结束使用关闭对象。
package main
import (
"fmt"
"log"
"sync"
"time"
"github.com/panjf2000/ants"
)
const (
runTime = 100
)
func demosFunc() {
time.Sleep(10 * time.Millisecond)
fmt.Println("Hello World!")
}
func demoFunc() {
time.Sleep(time.Duration(BenchParam) * time.Millisecond)
}
//antsDefaultCommon 使用默认普通pool
//其实就是使用了普通的pool,为了方便直接使用,在内部已经new了一个普通的pool,
//相当于下面那个新建的过程给你写好了,容量大小和过期时间都用默认的,详细信息可以看源码,里面剥一层就可以看到
//例子三
func antsDefaultCommon() {
var wg sync.WaitGroup //这里使用等待是为了看出结果,阻塞主线程,防止直接停止,如果在web项目中,就不需要
defer ants.Release() //退出工作,相当于使用后关闭
log.Println("start ants work")
for i := 0; i < runTime; i++ {
wg.Add(1)
ants.Submit(func() { //提交函数,将逻辑函数提交至work中执行,这里写入自己的逻辑
log.Println(i, ":hello")
time.Sleep(time.Millisecond * 10)
wg.Done()
})
}
wg.Wait()
log.Println("stop ants work")
}
//antsCommon 使用普通的pool
//例子一
func antsCommon() {
p, _ := ants.NewPool(BenchAntsSize, ants.WithExpiryDuration(DefaultExpiredTime)) //新建一个pool对象,其他同上
defer p.Release()
for j := 0; j < runTime; j++ {
_ = p.Submit(func() {
log.Println(":hello")
time.Sleep(time.Millisecond * 10)
})
}
}
//antsMarkFuncPut 使用特定的带有函数内容的pool
//例子二
func antsMarkFuncPut() {
var wg sync.WaitGroup
p, _ := ants.NewPoolWithFunc(10, func(i interface{}) { //新建一个带有同类方法的pool对象
myFunc(i)
wg.Done()
})
defer p.Release()
// Submit tasks one by one.
for i := 0; i < runTime; i++ {
wg.Add(1)
_ = p.Invoke(int32(i))
//这个就是发送,相当于上述普通的pool的submit,唯一不同的是参数,因为这个发送的同类型的方法,加入逻辑代码时注意
}
wg.Wait()
fmt.Printf("running goroutines: %d\n", p.Running())
fmt.Printf("finish all tasks, result is %d\n", sum)
if sum != 499500 {
panic("the final result is wrong!!!")
}
}
有疑问加站长微信联系(非本文作者)