core.async 去街区自己停车,还是有 'scheduler'?

Do core.async go blocks park themselves, or is there a 'scheduler'?

据我了解,在 JVM 上有一个线程池可用于 core.async go 块,线程数为 n + 2,其中 n 是核心数机器。

但是,可以在一个线程上同时部署多个go blocks。每个都处于停放状态(这意味着它的计算没有进行)或处于 运行 状态(其中它的计算围绕着产生热量的核心嗡嗡作响)。如果在四核机器上有 1000 个 go 块,那么我猜这 1000 个 go 块中最多有 6 个在任何时候处于 运行 状态。其他994个围棋块必须停放。

全线程被调度到一个核心上;通过 OS 调度程序或 JVM 主管线程。那么go是如何阻塞enter/exit停放状态的呢?当它对运行(块)感到厌倦时,它是否决定停放自己,或者是否有一个主管线程充当'go block scheduler',它确定哪个go块是运行在哪个线程上并受制于一些调度算法,如 Round Robin 等

谢谢

他们自己停车。

go 宏遍历整个表单,找到它需要停放的地方,并显式调用以将线程停放在这些地方。一些常见的是:

  • 其他go块的开始
  • 取自陈<!
  • 发送给一个频道>!
  • 调用 async/thread

这是 go 块不能跨越函数调用的很大一部分原因。 compiler/macro 需要能够看到整个代码块才能将它们放在正确的位置。