2012-03-02 57 views
7

我讀過akka文檔,並且在使用akka時無法對線程交互產生乾淨的理解。 Docs可能會忽略這個東西,但它對我來說並不那麼明顯。akka actor如何在線程之間進行交互

所有的阿卡演員似乎都在同一個線程中運行,他們被稱爲。我將演員視爲共同程序,每次接到呼叫時都有自己的堆棧重置。

您可以執行一系列直線切換演員。每個接收執行小的非阻塞操作並強制另一個接收進一步工作。沒有事件循環,可以處理演員系統之外的消息。

我想趕上來自其他線程的請求,執行控制操作,並等待另一條消息。

有一些用例概述了我的需求。

  1. 有線程不斷地輪詢來自某些來源的數據。一旦數據匹配模式,它就基於actor來調用事件驅動的處理程序。邏輯控制器做出決定並將其傳遞給工作人員。應該有兩個持久線程。一個線程在輪詢中不斷工作,另一個線程異步工作以控制它的工作。你不應該讓akka演員第一次線程,因爲他們打破了投票時間,第一個線程不應該阻止演員,所以他們需要另一個線程。

  2. 有某種雙面棋盤遊戲。一方擁有一個控制器線程,用於安排與電路板服務器等進行交互的計算時間。其他線程是一個沉重的計算線程遍歷不同的變體和因爲它已阻止自然

不能寫在阿卡我意識到現有的阿卡期貨,但它們代表了運行一次發射和關閉工作任務在執行他們的目標後下來。期貨與akka演員很好地結合,但不能表達循環的工作線索。

Akka演員系統包含不同種類的網絡事件循環。您可以使用其內置的遠程參與者系統或衆所周知的0mq協議。但是使用網絡進行線程交互似乎對我來說過分了。

將akka線與akka線粘合起來的方法是什麼?我應該寫幾個特殊的程序來以線程安全的方式執行消息傳遞嗎?

+1

嗯,我不認爲我們會忽略所有這些:http://akka.io/docs/akka/2.0-RC4/scala/dispatchers.html – 2012-03-04 16:38:19

+0

再一次更正:akka演員不會在相同的情況下運行他們被調用的線程,請參閱我之前對文檔的評論。演員不是共同程序。 「堆棧重置」不是JVM支持的概念。 actor模型比線程更高的抽象層次。將消息傳遞給一個actor始終是線程安全的(參見'ActorRef.tell()') – 2012-03-04 16:48:00

+0

我建議你用apache camel集成checkout akka以便如何響應外部事件。這本書Akka Essentials http://www.packtpub。com/akka-java-applications-essentials/book對Java和Scala中大量可運行示例代碼的線程模型進行了清晰的描述,以獲得所有基礎知識。 – simbo1905 2013-06-29 22:28:47

回答

4

如果需要輪詢,那麼輪詢線程應該只是把無論是調查到的消息,並觸發其關閉,以一個演員。

我覺得使用帶有receiveTimeout的Actor以一定的間隔進行非阻塞式輪詢,當有些事情被輪詢時,它會將它發佈給其他的actor,或者甚至是它的ActorSystems的EventStream ,爲真正的酒吧 - 子行動。

+0

演員將運行什麼線程?演員系統下面有什麼線索用來保存自己的活動? – ayvango 2012-03-03 22:44:34

+0

在我的情況下,我使用akka通過3D查看器控制來控制擺動應用程序。所以我想要結合三個不同的事件循環,沒有競爭條件和塊。我需要更多關於akka系統結構的數據來構建正確的架構。 – ayvango 2012-03-04 00:08:03

+2

我們有約350頁的文檔:http://doc.akka.io – 2012-03-04 16:31:38

相關問題