一个简单的goroutine pool

package main

import (
	"fmt"
	"runtime"
	"strings"
	"sync"
)

type GoPool struct {
	Queue    chan func() (interface{}, error)
	PoolSize int //goroutine数量

	finishCallback func(interface{}, error)
}

//初始化
func (self *GoPool) Init(pool_size, task_size int) {
	self.Queue = make(chan func() (interface{}, error), task_size)
	self.PoolSize = pool_size
}

//start
func (self *GoPool) Start() {
	//开启PoolSize个goroutine
	for i := 0; i < self.PoolSize; i++ {
		go func() {
			for {
				task, ok := <-self.Queue
				if !ok {
					break
				}
				self.finishCallback(task())
			}
		}()
	}
}

//stop
func (self *GoPool) Stop() {
	close(self.Queue)
}

//添加任务
func (self *GoPool) AddTask(task func() (interface{}, error)) {
	self.Queue <- task
}

//设置callback
func (self *GoPool) SetFinishCallback(callback func(interface{}, error)) {
	self.finishCallback = callback
}

func main() {
	//打印CPU核数
	fmt.Println("cpu nums:", runtime.NumCPU())
	//设置最多使用CPU数量
	runtime.GOMAXPROCS(runtime.NumCPU())

	arr := []string{
		"ab/cd/ef",
		"11/22/33",
		"rr/qq/33",
		"vv/hh/mm",
	}

	pool := new(GoPool)
	pool.Init(3, len(arr))

	//使用WaitGroup控制同步
	var wg sync.WaitGroup
	for i := range arr {
		wg.Add(1)
		str := arr[i]
		pool.AddTask(func() (interface{}, error) {
			return split(str)
		})
	}

	//设置callback
	pool.SetFinishCallback(func(res interface{}, err error) {
		fmt.Println("res:", res)
		if err != nil {
			fmt.Println("err:", err)
		}
		wg.Done()
	})

	pool.Start()

	wg.Wait()

	pool.Stop()

	fmt.Println("finished...")
}

func split(str string) ([]string, error) {
	return strings.Split(str, "/"), nil
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值