据我了解,在JVM上有一个线程池可用于core.async go块,其线程数为n + 2
,其中n
是机器上的内核数。core.async是否会阻止自己停止,或者是否有'调度程序'?
但是,许多go块可以同时部署在一个线程上。每个处于停放状态(这意味着它的计算没有进行)或者处于运行状态(其计算是围绕产生热量的核心发出嗡嗡声)。如果在四核机器上有1000个go块,那么我猜想在任何一次运行状态下,这1000个go块中最多有6个是go块。因此,其他994个方块必须停放。
全线程被调度到核心;无论是由OS调度程序还是由JVM管理程序线程来完成。那么一个go block如何进入/退出停放状态?当它厌倦了正在运行的程序块(块)时,它是否决定停止自己?还是有一个作为“go block scheduler”的supervisor线程,它决定哪个线程正在哪个线程上运行,并受到某些调度算法的影响,例如Round Robin等
谢谢
我认为你正在将'core.async'的通道与它的IOC“线程”混合在一起,你可以使用'go'宏来创建通道。频道实际上并不做任何事情,所以它们不会处于跑步或停车状态。 –
core.async的* go block * park在某些使用停车操作的地方。这些是'core.async'编译器可以停放这些块的点。如果在go块中执行一些阻止IO操作,那不是core.async提供的操作之一,那么您将阻塞core.async线程池中的一个线程。这是我从Timothy Baldrige的视频Macro Internals [part I](https://www.youtube.com/watch?v=R3PZMIwXN_g)和[part II](https://www.youtube.com/watch? v = SI7qtuuahhU)。两者都非常有趣。 –
@ user3231690我更新了问题,以便问题指的是去块而不是频道。 –