golang_Pool: go实现协程池

本文介绍了如何在 Go 语言中初始化并使用协程池。通过维护一个First In Last Out (FILO) 队列来管理Worker,当有任务请求时,会检查队列中是否有空闲的Worker执行任务。如果没有空闲Worker且未超过Pool容量,则创建新的Worker处理任务,否则阻塞等待。每个Worker完成任务后返回Pool等待新的任务。
摘要由CSDN通过智能技术生成

初始化一个 Goroutine Pool 池,这个Pool维护了一个类似栈的FILO队列 ,里面存放负责处理任务的Worker,然后每有一个请求就开启一个协程。
之后

  1. 检查当前Worker队列中是否有空闲的Worker,如果有,取出执行当前的task;
  2. 没有空闲Worker,判断当前在运行的Worker是否已超过该Pool的容量,是 — 阻塞等待直至有Worker被放回Pool;否 — 新开一个Worker(goroutine)处理;
  3. 每个Worker执行完任务之后,放回Pool的队列中等待。

参考资料:《Go语言实战》7.2章 Pool

package main

import (
	"io"
	"log"
	"sync"
	"errors"
)

// Pool管理一组可以安全在多个goroutine间共享的资源
// 被管理的资源必须实现io.Closer接口
type Pool struct {
   
	m         sync.Mutex
	resources chan io.Closer
	factory   func() (io.Closer, error)
	closed    bool
}

// ErrPoolClosed表示请求了一个已经关闭的池
var ErrPoolClosed = errors.New("Pool has been closed.")

//New创建一个用来管理资源的池
func New(fn func
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值