2 回答
TA贡献1744条经验 获得超4个赞
因为它停在这里:
workerAddr := <-registerChan
对于缓冲通道:
要使其workerAddr := <-registerChan
正常工作:通道registerChan
必须有一个值;否则,代码将在此停止等待通道。
我设法以这种方式运行你的代码(试试这个):
package main
import (
"fmt"
"sync"
)
func main() {
registerChan := make(chan int, 1)
for i := 1; i <= 10; i++ {
wg.Add(1)
go fn(i, registerChan)
}
registerChan <- 0 // seed
wg.Wait()
fmt.Println(<-registerChan)
}
func fn(taskArgs int, registerChan chan int) {
workerAddr := <-registerChan
workerAddr += taskArgs
registerChan <- workerAddr
wg.Done()
}
var wg sync.WaitGroup
输出:
55
说明:
此代码使用通道和 10 个 goroutine 加上一个主 goroutine 将 1 与 10 相加。
我希望这有帮助。
TA贡献1797条经验 获得超6个赞
当您运行此语句时registerChan <- workerAddr
,如果通道容量已满,则无法添加它,并且它将阻塞。如果你有一个池,比如 10 个workerAddr,你可以在调用之前将它们全部添加到容量为 10 的缓冲通道中schedule
。不要在调用后添加,以保证如果您从通道中获取值,之后有空间再次添加它。defer
在 goroutine 的开头使用是很好的。
- 2 回答
- 0 关注
- 125 浏览
添加回答
举报