1 回答
TA贡献1898条经验 获得超8个赞
为了扩展@Peter 的评论,这里是您编写的代码的执行流程:
初始化后,你启动你的
workergoroutines。每个workergoroutine 都会超过messageChannel,延迟 1 秒会打印出一条消息。接下来,您
messageChannel通过 for 循环插入一些消息。每个可用worker的 goroutine 都会收到一条消息,直到所有消息都被处理并打印出来。之后,workergoroutines 正在等待来自messageChannel.在用于在中插入消息的 for 循环
messageChannel完成后,您执行该stop函数,该函数阻塞wg.Wait()并等待所有wg.Done()调用在所有workergoroutine 中执行。然而,由于messageChannel没有关闭,没有一个workergoroutine 可以完成执行,也没有一个wg.Done()调用被执行。workergoroutines 被卡住是因为它messageChannel永远不会关闭,maingoroutines 因为函数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 关注
- 114 浏览
添加回答
举报
