2015-05-12 75 views
1

我有一個演員,有一個可變的狀態。在我的接收方法中,我模式匹配消息並調用一些將返回Future的服務。這個未來會修改我的Actor實例中的狀態。這種狀態不是線程安全的嗎?由於Future將在不同的線程中執行,因此我的Actor中的狀態是否保證線程安全?阿卡線程安全與期貨

+0

可以使用pipeTo模式與演員中的Futures和mutable狀態一起工作。 –

+0

如何做一個context.become? – sparkr

+0

@ user3102968 context.become在修改內部可變狀態時仍不能解決問題。此時,Actor可能正在處理不同的消息,並且當Future也正在修改內部狀態時,您將遇到競爭狀況。 如果我的答案是解決方案,請將其標記爲已接受,謝謝。 –

回答

7

不會像您正確設想的那樣不會出現線程安全問題。期貨在執行上下文提供的任何線程上運行。

解決這個問題的方法是將其返回給同一個參與者。所有演員的輸入必須始終是消息。你可以找到documentation here

一些示例代碼:

import akka.pattern.pipe 

//... inside the Actor somewhere: 
val futureResult: Future[YourType] = something.thatReturnsAFuture() 
futureResult.pipeTo(self) 

,然後修改您的接收塊因此未來完成後的結果將被處理,並且被送到回到這個演員:

case result: YourType => //...