2012-01-24 54 views
17

據我所知,參與者基本上是在線程之上實現的輕量級線程,在一小羣共享線程上運行許多參與者。scala actors vs線程和阻止IO

鑑於這種情況,在actor中使用阻塞操作會阻塞底層線程。這不是一個正確性問題,因爲演員圖書館會根據需要產生更多的線索(是嗎?),但是最後你會得到很多很多的線索,否定了首先使用演員的好處。

鑑於此,當您需要執行此類IO操作時,演員如何工作?是否存在「actor-block」的操作,在讓線程繼續執行其他操作的同時暫停actor(就像阻塞操作在讓CPU繼續執行其他操作的同時掛起線程一樣),或者是用CPS編寫的一切演員?或者演員是不是很適合這種長時間運作?

背景:我有經驗編寫多線程的東西的經驗,並理解美麗的CPS /事件循環如何工作,但絕對沒有與演員合作的經驗,只是想從高層次理解它們如何適合,然後再深入代碼。

+1

它應該涉及某些點分隔的延續,如http://jim-mcbeath.blogspot.com/2010/09/scala-coroutines.html中所述。或者也許使用非阻塞消息流? (http://blog.typesafe.com/non-blocking-message-flow-with-akka-actors) – VonC

+0

請點擊這裏http://stackoverflow.com/questions/1512066/is-there-any-non看到我的回答-blocking-IO-開放源代碼實現換scalas,演員 –

回答

2

這不是一個正確的問題,因爲演員庫將產生更多的線程在必要時(是嗎?)

到目前爲止,據我所知,這是不對的。該演員被阻止,並向其發送另一條消息導致該消息坐在演員郵箱中,直到該演員可以將該消息receive或該react發送給該消息。

在Scala(1)中的編程中,它明確規定參與者不應該阻止。如果演員需要做長時間運行,它應該將工作傳遞給第二個演員,以便主演員可以釋放自己並從其郵箱中讀取更多消息。一旦工作人員完成了工作,它就可以將這一事實傳達給主要參與者,主要參與者可以完成所做的任何事情。

因爲工人也有郵箱,所以最終會有幾名工人忙於工作。如果你沒有足夠的CPU來處理這些問題,他們的隊列將變得越來越大。最終,您可以通過使用遠程演員來擴展。在這種情況下,Akka可能更有用。

(1)規劃在斯卡拉第32.5(Odersky的,第二版,2010)

編輯:我發現這一點:

的演員特質的調度方法可以覆蓋到返回ResizableThreadPoolScheduler,它調整其線程池的大小以避免由調用任意阻塞方法的actor所造成的飢餓。

發現它在:http://www.scala-lang.org/api/current/scala/actors/Actor.html

所以,這取決於調度手段IMPL設置,也許是用來運行演員池將增加。當我說你錯了時,我錯了:-)答案的其餘部分仍然如此。

1

erlang的工作原理是,所有的阻塞操作都應該通過發送消息來阻止,因爲當你的actor被阻塞等待消息時,它會把線程交給其他actor。

因此,如果您想要執行一些阻止操作(如從文件讀取),則應執行使用非bloking api從文件讀取和寫入的FileReader參與者。並讓你的其他演員使用這個演員(發送和接收消息)作爲api讀取和寫入文件。