【问题标题】:Do core.async go blocks park themselves, or is there a 'scheduler'?core.async go 块会自行停车,还是有“调度程序”?
【发布时间】:2016-06-12 21:03:04
【问题描述】:

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

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

全线程被调度到一个核心上;由 OS 调度程序或 JVM 主管线程执行。那么 go 块是如何进入/退出 parked 状态的呢?当它厌倦了运行(块)时,它是否决定自行停放,或者是否有一个主管线程充当“执行块调度程序”,它确定哪个执行块在哪个线程上运行并受制于某些调度算法,例如循环等.

谢谢

【问题讨论】:

  • 我认为您将core.async 的频道与其可以使用go 宏创建的IOC“线程”混为一谈。频道实际上不任何事情,因此它们永远不会处于运行或停放状态。
  • core.asyncgo blocks 在使用停车操作的特定地点停车。这些是core.async 编译器可以停放这些块的点。如果您在 go 块内执行一些阻塞 IO 操作,这不是 core.async 提供的操作之一,那么您将阻塞 core.async 线程池中的线程之一。这是我从 Timothy Baldrige 的视频 Macro Internals part Ipart II 中了解到的。两者都很有趣。
  • @user3231690 我更新了问题,以便问题指的是 go 块而不是频道。

标签: clojure core.async


【解决方案1】:

他们自己停车。

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

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

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

【讨论】:

  • 可能的错字:“函数调用”->“函数定义”
  • 谢谢 Arthur - 这是否意味着 go 块不是执行 IO/网络工作的最佳位置 - 如果 go 块正在等待 web 服务调用,宏将不知道阻塞多长时间返回..
  • 总是为他们使用异步/线程,你很好。 (当然,直到你用完系统上的总线程,或者内存用完)我每天都用它来调用数据库和调用其他服务。
  • 明确地说,如果一个 go 块会进行阻塞调用,它应该是对线程的调用。它们在其他方面是相同的
猜你喜欢
  • 2015-12-10
  • 1970-01-01
  • 2014-03-11
  • 1970-01-01
  • 2018-07-09
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多