![]() |
1
24
围棋
如果可以进行多个通信,则随机选择一个。这不是一个完美的随机分布,规范也不能保证这一点,但它是随机的。
你所经历的是围棋运动场
由于您的代码中没有阻塞操作,goroutines可能不会被放置在公园中,并且可能只有一个“producer”goroutines会运行,而另一个可能不会被调度(永远)。
在我的本地计算机上运行你的代码
如果您需要确定单个案例的优先级,请查看以下答案: Force priority of go select statement
的默认行为
如果两个电源值都相同,则上述2个非阻塞接收将以相同的速度(具有相同的优先级)耗尽2个通道,如果其中一个没有,则另一个通道将持续接收,而不会延迟或阻塞。
需要注意的是,如果
没有一个
在提供任何接收值的通道中,这基本上是一个“繁忙”循环,因此会消耗计算能力。为了避免这种情况,我们可能会检测到没有通道准备就绪,并且
然后
使用
有关goroutine调度的更多详细信息,请参阅以下问题: Number of threads used by Go runtime Goroutines 8kb and windows OS thread 1 mb Why does it not create many threads when many goroutines are blocked in writing file in golang? |
![]() |
2
2
正如评论中提到的,如果你想确保平衡,你可以放弃使用
|
![]() |
3
0
已编辑 :你也可以从供应方面进行平衡,但对我来说,@icza的答案似乎比这个更好&还解释了导致这种情况的最初原因。令人惊讶的是,即使在我的(虚拟)机器上,这也是片面的。 这里有一些东西可以从供应端平衡两个例程(不知何故似乎在操场上不起作用)。
通过改变
|
![]() |
4
0
似乎其他所有的评论者都忽略了真正的bug。 这是不平衡的原因,因为它实际上永远无法与上面的代码平衡。它是单个线程,因此for循环在每次通过循环时只能处理chana或chanb。所以:一个chan总是先达到1000个。 if语句使用||,这意味着当其中一个到达1000时,它将停止。 这里简单的错误修复:将| |更改为&&在if语句中 |
![]() |
Jordan · 处理条件异步函数返回数据的惯用方法是什么? 7 年前 |
|
user5682282 · 从其他线程读取值 7 年前 |
![]() |
Omer Akhter · 通过通道发送指针 7 年前 |
![]() |
kmad1729 · goroutine阻塞和非阻塞使用 7 年前 |
![]() |
Cadel Watson · 在一定时间内从goroutine接收值 7 年前 |
![]() |
Terry Pang · 当涉及多个通道时,select如何工作? 7 年前 |
|
mrjd · Goroutine不运行 7 年前 |