Clojure core.async go blocks是否自行停车,或者是否存在';调度程序';?

Clojure core.async go blocks是否自行停车,或者是否存在';调度程序';?,clojure,core.async,Clojure,Core.async,据我所知,在JVM上有一个线程池可供core.async go块使用n+2线程数,其中n是机器上的内核数 但是,许多go块可以同时部署在一个线程上。每个都处于停止状态(这意味着其计算没有进行)或运行状态(其中其计算围绕产生热量的堆芯嗡嗡作响)。如果一台四核机器上有1000个go块,那么我猜在任何一次运行状态下,这1000个go块中最多有6个。因此,其他994个go街区必须停车 将全线程调度到核心上;由操作系统调度程序或JVM主管线程执行。那么go block如何进入/退出停驻状态?当它对运行(块

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

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

将全线程调度到核心上;由操作系统调度程序或JVM主管线程执行。那么go block如何进入/退出停驻状态?当它对运行(块)感到厌烦时,它是否决定将自己停下来,或者是否有一个主管线程充当“go block scheduler”(go block scheduler),它决定哪个go块在哪个线程上运行,并遵循一些调度算法,如循环调度等

谢谢他们自己停车

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

  • 其他go块的开始
  • 从成龙身上取下
  • 发送到chan
    >
  • 调用
    async/thread

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

我认为您将
核心.async
的通道与可以使用
go
宏创建的IOC“线程”混淆了。频道实际上什么都不做,所以它们永远不会处于运行或停驻状态。
core.async
的go Block会停在使用停驻操作的某些点上。这些是
core.async
编译器可以存放这些块的地方。如果您在go块中执行某些阻塞IO操作,而这不是core.async提供的操作之一,那么您将阻塞core.async的线程池中的一个线程。这是我从Timothy Baldrige的视频和宏内部理解的。这两个问题都很有趣。@user3231690我更新了这个问题,使这个问题是指go块而不是通道。可能的输入错误是:“函数调用”->“函数定义”感谢Arthur-这是否意味着go块不是执行IO/网络操作的最佳位置-如果go块等待webservice调用返回,宏将不知道要阻止多长时间。始终对它们使用async/thread,这样您就可以了。(当然,直到系统上的线程总数用完,或者内存耗尽)我每天都使用它来进行db调用和对其他服务的调用。它们在其他方面是相同的