摘要:这是一个有趣的协程例子,了解其中的原理,对于理解协程、channel非常有帮助。
程序如下所示:
1 | package main |
在 mian 函数的 for 循环中启动 100000 个协程。在循环之后,向 right 通道中插入 0,最后打印结果。
这里可以猜想一下,最后输出的结果是什么?
1 | 输出结果: |
不知道你是否猜想正确了,反正我是错了。
在没有运行程序之前,我认为leftmost的结果为1,认为只在最初做了一次赋值,实际结果为100000(无缓存信道,具有同步阻塞的特性),这个是为什么呢?
- 1.主线程的right <- 0,right不是最初循环的那个right,而是最终循环的right
- 2.for循环中最初的go f(left, right)因为没有发送者一直处于等待状态
- 3.当主线程的right <- 0执行时,类似于递归函数在最内层产生返回值一般
参考文章
- 本文作者: th3ee9ine
- 本文链接: https://www.blog.ajie39.top/2022/06/18/一个有意思的协程例子/
- 版权声明: 本博客所有文章除特别声明外,均采用 LICENSE 下的许可协议。转载请注明出处!