请教一个并发例子的实现

lichehuo · · 1090 次点击
阻塞的原因是什么,就是你要求消费者来关闭通道。 ``` for metrics := range metricsChannel { fmt.Println(metrics) io.WriteString(w, metrics) } defer close(metricsChannel) ``` 在这里,defer 这一句永远执行不了,因为上面的 for loop 不会停止,一直处于等待生产者继续生产的状态。 解决方案可想而知,把 defer close() 放到生产者那里。 ``` func metricsProducer(metricsChannel chan<- string) { commands := [3]string{"ls", "ls -lrt", "hostname -i"} for _, cmd := range commands { metricsChannel <- fetchMetrics(cmd, "this is test") } defer close(metricsChannel) } ```
#4
更多评论
看代码看得眼睛疼,这个必然阻塞啊。 你需要理解下 for metrics := range metricsChannel 是什么…… chan是个进程见通行的缓存。 正常情况请按 <-和 ->的方式来操作。 需要做消费者的话,应该在主进程里起一go用select来读数据。 另外不太明白你现在这个用途为什么需要用到chan.
#1
抱歉,不会排版,耽误你时间了。 非常感谢你的回复,我初衷是觉得我执行command的时候,有些command可能执行时间长,所以我想着只要command执行完了就把结果丢到chan去,然后我消费端把它消费。
#2