1
我有一個演員,有一個可變的狀態。在我的接收方法中,我模式匹配消息並調用一些將返回Future的服務。這個未來會修改我的Actor實例中的狀態。這種狀態不是線程安全的嗎?由於Future將在不同的線程中執行,因此我的Actor中的狀態是否保證線程安全?阿卡線程安全與期貨
我有一個演員,有一個可變的狀態。在我的接收方法中,我模式匹配消息並調用一些將返回Future的服務。這個未來會修改我的Actor實例中的狀態。這種狀態不是線程安全的嗎?由於Future將在不同的線程中執行,因此我的Actor中的狀態是否保證線程安全?阿卡線程安全與期貨
不會像您正確設想的那樣不會出現線程安全問題。期貨在執行上下文提供的任何線程上運行。
解決這個問題的方法是將其返回給同一個參與者。所有演員的輸入必須始終是消息。你可以找到documentation here。
一些示例代碼:
import akka.pattern.pipe
//... inside the Actor somewhere:
val futureResult: Future[YourType] = something.thatReturnsAFuture()
futureResult.pipeTo(self)
,然後修改您的接收塊因此未來完成後的結果將被處理,並且被送到回到這個演員:
case result: YourType => //...
可以使用pipeTo模式與演員中的Futures和mutable狀態一起工作。 –
如何做一個context.become? – sparkr
@ user3102968 context.become在修改內部可變狀態時仍不能解決問題。此時,Actor可能正在處理不同的消息,並且當Future也正在修改內部狀態時,您將遇到競爭狀況。 如果我的答案是解決方案,請將其標記爲已接受,謝謝。 –