Golang频道发行
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Golang频道发行相关的知识,希望对你有一定的参考价值。
我有一个简单的渠道示例:https://play.golang.org/p/eLcpzXeCHms
package main
import (
"fmt"
)
func execute(trueChan chan<- bool, lowerRange int32, upperRange int32)
for lowerRange <= upperRange
fmt.Printf("\nhandling number %v", lowerRange)
if lowerRange%2 == 0
go func()
trueChan <- true
()
lowerRange++
close(trueChan)
func main()
counter := 0
trueChan := make(chan bool)
execute(trueChan, 5, 25)
for
if _, ok := <-trueChan; ok
counter++
else
break
fmt.Printf("\n%v", counter)
第一个问题:有时会收到错误消息...
handling number 5
handling number 6
handling number 7
handling number 8
handling number 9
handling number 10
handling number 11
handling number 12
handling number 13
handling number 14
handling number 15
handling number 16
handling number 17
handling number 18
handling number 19
handling number 20
handling number 21
handling number 22
handling number 23
handling number 24
handling number 25
0
panic: send on closed channel
还有第二个问题-我的计数器始终为0。
有人可以提示我,我在做什么错吗?
答案
您的代码:
- 创建一个无缓冲的通道
trueChan
。 - 创建10个goroutine,每个goroutine将尝试写入
trueChan
,它将阻塞直到从中读取某些内容。 - 关闭
trueChan
,然后返回到main()
- [
main()
打印0
,因为它尚未从goroutine中读取任何内容 - 同时,由于在步骤3中关闭了
trueChan
,因此在使用goroutine之前,第一个尝试写入通道紧急情况的goroutine
[至少,您不应该关闭trueChan
,直到您知道所有goroutine都已完成。实际上,您要在他们甚至begin使用它之前就关闭它。
A sync.WaitGroup
可能是实现此目的的一种方法,但是在您的代码中如何实现它并不明显,因为我不确定您的目标是什么。这段代码看起来像一个简单的练习,而不是真实的示例。如果您能解释您的目标,我可能会提供更具体的建议。
另一答案
您的第一个和第二个问题都在同一个根源:您在主例程
以上是关于Golang频道发行的主要内容,如果未能解决你的问题,请参考以下文章
golang [去阻塞频道]与Go#golang,#go,#go channels,#go synchronization,#goroutines,#waitgroups中的频道同步和阻止,