golang-panjf2000/ants协程池实际使用小结

哆啦在这A梦在哪 · · 6907 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

注意

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!!!")
    }
}


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:哆啦在这A梦在哪

查看原文:golang-panjf2000/ants协程池实际使用小结

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

6907 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传