golang-panjf2000/ants 协程池实际使用小结
作者:互联网
原文链接:https://studygolang.com/articles/27181
//注意 //线程池执行有两种,一种执行普通逻辑方法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!!!") } }
标签:wg,panjf2000,使用,ants,golang,func,time,pool 来源: https://www.cnblogs.com/wangjq19920210/p/15337812.html