美文网首页
ants协程池 2022-01-10

ants协程池 2022-01-10

作者: 9_SooHyun | 来源:发表于2022-01-10 15:17 被阅读0次

    github

    https://github.com/panjf2000/ants

    基本使用

    • 阻塞式协程池例子
    func TestAntsPool(t *testing.T) {
           // worker function
        f := func(i interface{}) {
            fmt.Println("running ", i)
            time.Sleep(5 * time.Second)
        }
        // 创建阻塞式协程池,pool_size为1
        p, _ := ants.NewPoolWithFunc(1, f, ants.WithNonblocking(false))
    
        // use a goroutine to submit a task to a pool
        var wg = &sync.WaitGroup{}
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                fmt.Println(i, " invoke time", time.Now())
                err := p.Invoke(i)
                fmt.Println(i, " invoke finished time", time.Now())
                if err != nil {
                    fmt.Println("err: ", err.Error())
                }
            }(i)
        }
        wg.Wait()
    }
    

    output

    0  invoke time 2022-01-10 14:16:53.254327218 +0800 CST m=+0.271339451
    4  invoke time 2022-01-10 14:16:53.254330755 +0800 CST m=+0.271342968
    1  invoke time 2022-01-10 14:16:53.254351734 +0800 CST m=+0.271363967
    2  invoke time 2022-01-10 14:16:53.254340133 +0800 CST m=+0.271352346
    0  invoke finished time 2022-01-10 14:16:53.254397901 +0800 CST m=+0.271410114
    running  0
    3  invoke time 2022-01-10 14:16:53.254358828 +0800 CST m=+0.271371051
    4  invoke finished time 2022-01-10 14:16:58.255227731 +0800 CST m=+5.272239934
    running  4
    1  invoke finished time 2022-01-10 14:17:03.259344098 +0800 CST m=+10.276356311
    running  1
    2  invoke finished time 2022-01-10 14:17:08.263325553 +0800 CST m=+15.280337766
    running  2
    3  invoke finished time 2022-01-10 14:17:13.263580826 +0800 CST m=+20.280593039
    running  3
    PASS
    

    上面的例子中,round 1 2 3 4 的invoke被调用和返回都存在时间差,invoke内部会去寻找一个可用的worker协程:

    // Invoke submits a task to pool.
    func (p *PoolWithFunc) Invoke(args interface{}) error {
        if p.IsClosed() {
            return ErrPoolClosed
        }
        var w *goWorkerWithFunc
        if w = p.retrieveWorker(); w == nil {
            return ErrPoolOverload
        }
        w.args <- args
        return nil
    }
    

    在阻塞式协程池中,如果retrieveWorker()找不到可用的worker协程,内部会wait()阻塞住,等待存在可用的worker协程时唤醒;而在非阻塞式协程池中,如果找不到可用的worker协程,retrieveWorker()会返回一个nil worker,那么Invoke会直接返回ErrPoolOverload

    • 非阻塞式协程池例子
    func TestAntsPool(t *testing.T) {
        // worker function
        f := func(i interface{}) {
            fmt.Println("running ", i)
            time.Sleep(5 * time.Second)
        }
        // 阻塞式协程池
        p, _ := ants.NewPoolWithFunc(1, f, ants.WithNonblocking(true))
    
        // use a goroutine to submit a task to a pool
        var wg = &sync.WaitGroup{}
        for i := 0; i < 5; i++ {
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                fmt.Println(i, " invoke time", time.Now())
                err := p.Invoke(i)
                fmt.Println(i, " invoke finished time", time.Now())
                if err != nil {
                    fmt.Println(i, " err: ", err.Error())
                }
            }(i)
    
        }
        wg.Wait()
    }
    
    2  invoke time 2022-01-10 15:16:35.271265597 +0800 CST m=+0.186927295
    4  invoke time 2022-01-10 15:16:35.271254096 +0800 CST m=+0.186915783
    4  invoke finished time 2022-01-10 15:16:35.271326442 +0800 CST m=+0.186988179
    2  invoke finished time 2022-01-10 15:16:35.271327854 +0800 CST m=+0.186989541
    3  invoke time 2022-01-10 15:16:35.271310131 +0800 CST m=+0.186971818
    3  invoke finished time 2022-01-10 15:16:35.2713415 +0800 CST m=+0.187003187
    3  err:  too many goroutines blocked on submit or Nonblocking is set
    running  2
    4  err:  too many goroutines blocked on submit or Nonblocking is set
    0  invoke time 2022-01-10 15:16:35.271258314 +0800 CST m=+0.186919991
    0  invoke finished time 2022-01-10 15:16:35.271353092 +0800 CST m=+0.187014779
    0  err:  too many goroutines blocked on submit or Nonblocking is set
    1  invoke time 2022-01-10 15:16:35.271356658 +0800 CST m=+0.187018345
    1  invoke finished time 2022-01-10 15:16:35.271394629 +0800 CST m=+0.187056316
    1  err:  too many goroutines blocked on submit or Nonblocking is set
    

    相关文章

      网友评论

          本文标题:ants协程池 2022-01-10

          本文链接:https://www.haomeiwen.com/subject/gymmcrtx.html