协程池简单来说就是一个管道进,一个管道出,多个协程工作。
实现一:无顺序协程工作
package main
import (
"fmt"
)
var workerNum = 3
func worker(id int, jobs <-chan int, results chan<- int) {
for j := range jobs {
fmt.Println("worker", id, "processing job", j)
time.Sleep(time.Second)
results <- j * 2
}
}
func main() {
jobs := make(chan int, 100)
results := make(chan int, 100)
for w := 1; w <= workerNum; w++ {
go worker(w, jobs, results)
}
for j := 1; j <= 9; j++ {
jobs <- j
}
close(jobs)
for a := 1; a <= 9; a++ {
fmt.Println(<-results)
}
}
实现二:有顺序协程工作
func main() {
a := 0
fn := func() int {
a++
return a
}
ch1 := make(chan int, 1)
ch2 := make(chan int, 3)
for i := 0; i < 3; i++ {
go func(j int) {
for {
ch1 <- 1
n := fn()
if n > 100 {
ch2 <- j
<-ch1
return
}
fmt.Println("go", j, ":", n)
<-ch1
}
}(i)
}
for i := 0; i < 3; i++ {
aa, ok := <-ch2
fmt.Println(aa, ":::", ok)
}
}
实现三:固定顺序和编号协程工作
这个需要前一个协程给后一个协程使用管道发送消息,有点复杂,这里贴一个大佬的实现过程
go实现N个协程交替顺序打印自然数的详细解释
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)