创建golang协程池
Golang协程池(goroutine pool)是一种并发编程的技术,它可以在预先创建一定数量的协程(goroutine)后,通过将任务分配给这些协程来提高程序的并发性能和效率。下面是一个简单的Golang协程池实现示例:
package main
import (
"fmt"
"sync"
)
type Job func()
type Pool struct {
jobs chan Job
wg sync.WaitGroup
}
func NewPool(numWorkers int) *Pool {
p := Pool{
jobs: make(chan Job),
}
p.wg.Add(numWorkers)
for i := 0; i < numWorkers; i++ {
go func() {
defer p.wg.Done()
for job := range p.jobs {
job()
}
}()
}
return &p
}
func (p *Pool) AddJob(job Job) {
p.jobs <- job
}
func (p *Pool) Wait() {
close(p.jobs)
p.wg.Wait()
}
func main() {
pool := NewPool(4)
for i := 0; i < 10; i++ {
job := func() {
fmt.Printf("Executing job %d\n", i)
}
pool.AddJob(job)
}
pool.Wait()
fmt.Println("All jobs done")
}
在上面的示例代码中,Pool
结构体表示协程池,其中jobs
通道用于接收任务,wg
变量用于等待所有工作协程的完成。NewPool
函数用于创建协程池,其参数numWorkers
表示要创建的工作协程的数量。在NewPool
函数中,我们使用for
循环创建numWorkers
个工作协程,并将它们的处理函数放在一个goroutine
中运行。在这些工作协程的处理函数中,它们会不断地从jobs
通道中接收任务,并执行任务函数。AddJob
方法用于向协程池中添加任务,而Wait
方法则用于等待所有任务完成。在main
函数中,我们创建一个协程池,并向其中添加10个任务,然后调用Wait
方法等待任务完成。