taskpool 协程池

xuesongtao · 2022-02-24 10:28:34 · 2274 次点击    
这是一个分享于 2022-02-24 10:28:34 的资源,其中的信息可能已经有所发展或是发生改变。

1. 介绍

  • 支持预分配协程和用多少申请多少
  • 分配的协程都有一个生命周期,生命周期到了会被自动回收
  • 协程池最少有一个哨兵协程,最多有 maxWork + 1(哨兵)
  • 协程池会自己释放, 不需要手动释放

2. 使用

    pushPool := lib.NewTaskPool("poolName", 10, lib.WithProGoWorker())
    defer pushPool.Close()

    everyTaskHandleSum := 500
    l := 50000
    pushIds := []string{xxx}
    totalPage := math.Ceil(float64(l) / float64(everyTaskHandleSum))
    for page := 1; page <= int(totalPage); page++ {
        // 根据切片分页
        startIndex, endIndex := lib.GetPapeSliceIndex(int32(page), int32(everyTaskHandleSum), l)
        tmpArr := pushIds[startIndex:endIndex]
        i.log.Infof("startIndex: %d, endIndex: %d, total: %d", startIndex, endIndex, l)

        // 阻塞式
        pushPool.Submit(func() {
            i.PushBatchMsg(tmpArr, info)
        })
    }

最后

  • 欢迎大佬们指正, 希望大佬给 star, toGit

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

2274 次点击  
加入收藏 微博
1 回复  |  直到
xuesongtao
xuesongtao · #1 · 3年之前

之前版本设计有个缺陷,如果 pool 为全局对象,在调用 Close() 无伤大雅,如果是局部 pool 的话, Close() 会导致任务未执行完就退出了;特此添加 SafeClose() 其会保证工作协程执行完才退出

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