初级会员
  • 第 57251 位会员
  • hkhl
  • hkhl
  • 2020-10-16 11:28:18
  • Offline
  • 19 97

最近发布的主题

    暂无

最近发布的文章

    暂无

最近分享的资源

    暂无

最近发布的项目

    暂无

最近的评论

  • `为什么信道done是有必要的,不能去掉?` <-done肯定不是多余的。 这里的go result(done)函数是在另一个协程中进行的,只会阻塞住当前的协程,不会阻塞主协程。所以12楼14楼@skyfly 解释不正确。 15楼通过去掉result的go让其阻塞主协程也ok。不过没有解释到<-done的原因。 ... ... 文中代码尝试去掉 <-done还会运行成功0~99的id数据,主要原因是跑在主协程的createWorkerPool(noOfWorkers)中wait函数会等所有携程执行完毕,而所有携程执行完毕则表示所有的数据已经从 jobs搬运到results中。 由于go result(done)函数执行很快没什么耗时,所以go result(done)协程几乎是和主协程同步完成。 **那是不是在go result(done)模拟耗时场景就能复现问题了? bingo** **函数提前结束,而协程go result(done)还未执行完毕。** 问题场景复现如下: 1、去掉30行代码time.Sleep(2 * time.Second) 主要是为了快速调试减少不必要耗时 2、58行后添加time.Sleep(1 * time.Second) 模拟耗时场景 3、65行代码noOfJobs := 12 原因同1 此时观察去掉<-done不阻塞的情况下,主协程会提前结束。 加上<-done, 会打印12条数据,程序正常。