go 协程池
时间: 2023-06-21 07:14:56 浏览: 58
在 Go 语言中,协程是轻量级的线程,可以在同一个进程中同时运行成百上千个协程,而不会导致系统资源的过度占用。协程池是一种常见的编程模式,它可以有效地管理协程的数量,减少协程的创建和销毁操作。
下面是一个简单的协程池实现:
```go
type Worker struct {
id int
taskQueue chan func()
quit chan bool
}
func NewWorker(id int, taskQueue chan func(), quit chan bool) Worker {
return Worker{
id: id,
taskQueue: taskQueue,
quit: quit,
}
}
func (w Worker) Start() {
go func() {
for {
w.taskQueue <- <- w.taskQueue
select {
case task := <- w.taskQueue:
task()
case <- w.quit:
return
}
}
}()
}
type Pool struct {
workers []Worker
taskQueue chan func()
quit chan bool
}
func NewPool(size int) Pool {
workers := make([]Worker, size)
taskQueue := make(chan func())
quit := make(chan bool)
for i := 0; i < size; i++ {
workers[i] = NewWorker(i, taskQueue, quit)
}
return Pool{
workers: workers,
taskQueue: taskQueue,
quit: quit,
}
}
func (p Pool) Start() {
for _, worker := range p.workers {
worker.Start()
}
}
func (p Pool) Stop() {
close(p.quit)
}
func (p Pool) Submit(task func()) {
p.taskQueue <- task
}
```
使用方法如下:
```go
func main() {
pool := NewPool(4)
pool.Start()
for i := 0; i < 10; i++ {
index := i
pool.Submit(func() {
fmt.Println("Task", index)
})
}
pool.Stop()
}
```
这个例子中,我们创建了一个协程池,大小为 4。然后我们提交了 10 个任务,每个任务都只是简单地打印一条消息。协程池会自动管理协程的数量,保持在指定的大小范围内。
需要注意的是,这个实现中并没有考虑协程执行任务的顺序和优先级,如果需要这些特性,需要对代码进行进一步的扩展。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![.zip](https://img-home.csdnimg.cn/images/20210720083646.png)