clojure - core.async go block 是否自行停放,或者是否存在 'scheduler' ?

标签 clojure core.async

据我了解,在 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/

相关文章:

clojure - 使用 Clojure 的 core.async 使用文件内容

unit-testing - 如何对 clojure.core.async go 宏进行单元测试?

Clojure core.async, channel 与端口

Scala、Groovy、Clojure

clojure - 我应该在 Clojure 中哪里使用 defrecord?

clojure - 部分理解 Clojure

clojure - 在 Clojure (core.async) 中,alt 和 alt 有什么区别?

clojure - core.async 中的 pub 和 mult 有什么区别?和示例用例?

mongodb - 如何使用 congomongo 的 fetch 查询嵌套文档?