2010-04-02 70 views
13

我一直在閱讀很多關於Scala和Erlang如何執行輕量級線程及其併發模型(actors)的內容。Scala和Erlang使用綠色線程嗎?

但是,我有我的疑惑。

Scala和Erlang使用類似於Java(綠色線程)所使用的舊線程模型的方法嗎?

例如,假設有一個2核的機器,那麼Scala/Erlang環境會爲每個處理器分配一個線程?其他線程將由用戶空間(Scala VM/Erlang VM)環境進行調度。它是否正確?

在引擎蓋下,這是如何工作的?

+0

Java十年來一直沒有使用綠色線程 – vemv 2013-01-06 02:13:41

回答

23

Erlang正在使用用戶空間多任務處理,任務一直運行到他們阻止或直到他們用完「減少」的份額。減少被模糊地定義爲一個計算單位。

直到SMP調度程序,只有一個內核線程執行可運行的任務。通過SMP調度,您有幾個內核線程執行任務,從而在多核機器上並行執行代碼。調度程序線程的數量應該與核心數量相匹配。請參閱the erl manpage中的-smp [enable|auto|disable]開關。

還有一個內核線程池供可加載驅動程序執行阻塞系統調用。這稱爲異步線程池。請參見中的+A size

延伸閱讀

+0

@thanks Christian。因此,用戶空間多任務調度程序將選擇一些由線程執行的「線程對象」。對 ? – CHAPa 2010-04-02 18:06:49

+0

我無法描述它比我鏈接到的EUC'08的pdf好得多。我相信目前的OTP版本現在有多個運行隊列,如5.2節所述,我們將來會生活。 – Christian 2010-04-03 14:01:43

+0

不,操作系統線程運行顯式處理進程及其調度的erlang調度程序。這就是爲什麼每個內核很少有多個線程的原因,至少在運行erlang代碼時是不需要的。操作系統線程通常用於erlang進程。 – rvirding 2010-04-05 23:43:55

1

Scala使用底層的Java線程實現,其中uses native threads

不能說關於Erlang。

+0

hi dave, 我知道,最新的JVM只使用本地線程,但是scala只能使用本地線程進行擴展。所以,我讀過的一些文章說,線程池(worker)用於Scala「併發環境」,而ideia使用的是較少可能的java線程(本地線程)。 – CHAPa 2010-04-02 13:24:05

+0

早期的Akka(基於Scala的演員庫)使用HawtDispatch(http://hawtdispatch.fusesource.org/)。但他們在此期間改變了其他的東西。我不知道它是什麼。如果你有興趣,你可以在Akka論壇(akka.io)撥打他們 – OlliP 2014-04-30 14:00:51

4

有關Erlang的實現細節的最新信息檢查fresh talkslides)。

+0

很酷,很好的談話。謝謝 – CHAPa 2010-04-02 18:38:23

13

Scala 2.8使用Java線程池。輕量級演員(Reactor)和輕量級模式中​​較重的演員(react {...})不佔用他們自己的線程;相反,當他們有消息的時候,他們需要一個線程,直到他們完成消息的處理,然後返回線程,直到下一個消息到達時才運行。

This article給出2.7的演員的體面的描述; 2.8沒有那麼不同。

+0

@Rex,但是爲了擴展,scala不能使用java線程(native OS Thread),它必須能夠創建一個新線程可用的環境,例如綠色線程。想象一下,100個演員,每個演員使用java線程,這不是輕量級的線程,因爲切換線程上下文不是太輕。對 ? – CHAPa 2010-04-02 18:02:06

+0

這是正確的。這些交換機不像Erlang那麼輕巧。幾乎總是可以避免100個線程上有100個角色(通過讓他們對消息作出反應而不是不斷運行),所以您仍然擁有支持整個事務的非輕量級Java線程,但重量更輕的消息消耗(因爲多個消息演員可以由一個線程處理)。由於這種架構,您可以擴展到很多反應式角色,而不會耗盡操作系統線程,但它不像Erlang那樣具有驚人的可擴展性。 (搜索「線程環基準槍戰」...) – 2010-04-02 19:06:23

+0

@CHAPa Akka演員基於回調,因此不需要多個線程。這種模式遠遠不如開發角度,但允許在僅提供線程池的平臺上使用它。 – rightfold 2015-07-13 18:01:51

相關問題