2016-06-12 70 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調用和調用其他服務。 –

相關問題