其他分享
首页 > 其他分享> > golang-panjf2000/ants 协程池实际使用小结

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