版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc

引言

很多时候,还是需要用到协程池的,简单撸了一个,方便工作中的需要,有bug请反馈

1. 安装

go get github.com/vearne/golib/utils

2. 使用

2.1 创建协程池

// 设定协程池的中协程的数量是30个
var p *utils.GPool = utils.NewGPool(30)

2.2 定义任务处理函数

任务处理函数形如

type JobFunc func(str string) bool

执行任务

GPool.ApplyAsync(f JobFunc, slice []string)

f JobFunc 是目标函数
slice []string 任务参数列表

示例

package main

import (
    "fmt"
    "github.com/vearne/golib/utils"
    "strconv"
)

func doubleStr(key string) bool {
    num, _ := strconv.Atoi(key)
    if num < 450 {
        return true
    }
    return false
}

func main() {
    // 协程池的大小是30
    var p *utils.GPool = utils.NewGPool(30)

    slice := []string{}
    for i := 0; i < 1000; i++ {
        slice = append(slice, strconv.Itoa(i))
    }

    result := make([]bool, 0, 10)
    trueCount := 0
    falseCount := 0
    // 任务执行结果从channel中返回
    for item := range p.ApplyAsync(doubleStr, slice) {
        result = append(result, item)
        if item {
            trueCount++
        } else {
            falseCount++
        }
    }
    fmt.Println("trueCount", trueCount, "falseCount", falseCount)
}

致谢

程序的API形式以及思路参考了python的multiprocessing模块,再此表示感谢


如果我的文章对你有帮助,你可以给我打赏以促使我拿出更多的时间和精力来分享我的经验和思考总结。

微信支付码

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.