Fork me on GitHub

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | 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(param interface{}) *GPResult

GPResult

type GPResult struct {
    Value interface{}
    Err   error
}

执行任务

ApplyAsync(f JobFunc, slice []interface{})

示例

pool.go

package main

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

func Judge(key interface{}) *utils.GPResult {
    result := &utils.GPResult{}
    num, _ := strconv.Atoi(key.(string))
    if num < 450 {
        result.Value = true
    } else {
        result.Value = false
    }
    return result
}

func main() {
    p := utils.NewGPool(30)

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

    result := make([]bool, 0, 10)
    trueCount := 0
    falseCount := 0
    for item := range p.ApplyAsync(Judge, slice) {
        value := item.Value.(bool)
        result = append(result, value)
        if value {
            trueCount++
        } else {
            falseCount++
        }
    }

    log.Printf("cancel, %v, true:%v, false:%v\n", len(result), trueCount, falseCount)
}

致谢

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


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

微信支付码

发表评论

电子邮件地址不会被公开。

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据