1 回答
TA贡献1898条经验 获得超8个赞
为了扩展@Peter 的评论,这里是您编写的代码的执行流程:
初始化后,你启动你的
worker
goroutines。每个worker
goroutine 都会超过messageChannel
,延迟 1 秒会打印出一条消息。接下来,您
messageChannel
通过 for 循环插入一些消息。每个可用worker
的 goroutine 都会收到一条消息,直到所有消息都被处理并打印出来。之后,worker
goroutines 正在等待来自messageChannel
.在用于在中插入消息的 for 循环
messageChannel
完成后,您执行该stop
函数,该函数阻塞wg.Wait()
并等待所有wg.Done()
调用在所有worker
goroutine 中执行。然而,由于messageChannel
没有关闭,没有一个worker
goroutine 可以完成执行,也没有一个wg.Done()
调用被执行。worker
goroutines 被卡住是因为它messageChannel
永远不会关闭,main
goroutines 因为函数wg.Wait()
内部的调用而被卡住stop
,你最终会陷入一个所有 goroutines 都处于休眠状态的死锁。
根据建议,您只需要交换地点stop
和close
电话
//rest of the code
close(messageChannel)
stop(wg)
这样,当所有消息都插入到 中时messageChannel,您调用close(messageChannel)然后stop(wg),这会阻塞wg.Wait调用。该close(messageChannel)调用确保,一旦从 中读取所有消息messageChannel,goroutine内部的for-range循环将退出,并且所有调用都将被执行。一旦发生这种情况,将解除阻塞,程序将正确完成执行。messageChannelworkerdefer wg.Done()wg.Wait()
- 1 回答
- 0 关注
- 82 浏览
添加回答
举报