2016-06-12 60 views
2

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

谢谢

+3

我认为你正在将'core.async'的通道与它的IOC“线程”混合在一起,你可以使用'go'宏来创建通道。频道实际上并不做任何事情,所以它们不会处于跑步或停车状态。 –

+1

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)。两者都非常有趣。 –

+0

@ user3231690我更新了问题,以便问题指的是去块而不是频道。 –

回答

2

他们停放自己。

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

  • 其他去块
  • 从陈<!
  • 采取发送到陈>!
  • 通话的开始async/thread

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

+0

潜在的错字:“函数调用” - >“函数定义” – Davyzhu

+0

感谢亚瑟 - 所以这意味着去块不是做IO /网络的最好的地方 - 宏不知道要多久才能阻止块正在等待Web服务调用返回.. – Zuriar

+1

总是使用异步/线程为他们和你的罚款。 (直到你用完了系统上的线程,或者耗尽内存)我每天都会使用它来调用db调用和调用其他服务。 –

相关问题