当我注意到并非管道中的所有关闭打印都被打印时,我根据《Go 中的并发》一书中的示例运行以下代码。
看到“完成倍增!” 不见了。
另一方面,NumGoroutine() 显示仅主函数正在运行。
下面的代码有什么问题?
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
generator := func(done <-chan struct{}) <-chan int {
intStream := make(chan int)
i:=0
go func() {
defer close(intStream)
for {
select {
case <-done:
fmt.Println("done generator!")
return
case intStream <- i:
time.Sleep(1 * time.Second)
i++
}
fmt.Println("generator after select")
}
}()
return intStream
}
multiply := func(
done <-chan struct{},
intStream <-chan int,
multiplier int,
) <-chan int {
multipliedStream := make(chan int)
go func() {
defer close(multipliedStream)
for i := range intStream {
select {
case <-done:
fmt.Println("done multiply !")
return
case multipliedStream <- i * multiplier:
}
fmt.Println("multiply after select")
}
}()
return multipliedStream
}
add := func(
done <-chan struct{},
intStream <-chan int,
additive int,
) <-chan int {
addedStream := make(chan int)
go func() {
defer close(addedStream)
for i := range intStream {
select {
case <-done:
fmt.Println("done add !")
return
case addedStream <- i + additive:
}
fmt.Println("add after select")
}
}()
return addedStream
}
眼眸繁星
一只甜甜圈
相关分类