据我了解,在 JVM 上有一个可供 core.async go block 使用的线程池,其中 n + 2
个线程,其中 n
是机器上的核心数。
但是,许多 Go block 可以同时部署在一个线程上。每个都处于停止状态(这意味着其计算没有进行)或处于运行状态(其中其计算围绕产生热量的核心嗡嗡作响)。如果一台四核机器上有 1000 个 go block ,那么我猜想这 1000 个 go block 中任意时刻最多有 6 个处于运行状态。因此,其他 994 个围棋 block 必须停放。
完整线程被调度到一个核心上;由操作系统调度程序或 JVM 管理线程执行。那么 go block 如何进入/退出停放状态呢?当它厌倦了运行( block )时,它是否决定自行停放,或者是否有一个主管线程充当“go block 调度程序”,它确定哪个go block 在哪个线程上运行,并服从某种调度算法,例如循环法等.
谢谢
最佳答案
他们自己 parking 。
go
宏遍历整个表单,找到需要停放的位置,并显式地调用以将线程停放在这些位置。一些常见的有:
- 其他 go block 的开始
- 取自陈
<!
- 发送给一个chan
>!
- 调用
async/thread
这是 go block 无法跨越函数调用的一个重要原因。编译器/宏需要能够看到整个代码块,以便将它们放在正确的位置。
关于clojure - core.async go block 是否自行停放,或者是否存在 'scheduler' ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779058/