我知道actor模型的一個優點是,一次只處理一條消息,簡化了併發問題。但在我看來,我的演員正在處理多個消息。在僞代碼中,我有演員同時處理多條消息
var status = 0
def receive = {
case DoSomething =>
val dest = sender()
status = 0
for {
otherActor <- resolveOtherActor("/user/OtherActor")
} yield {
for {
res <- {status = 1
otherActor ? doSomething1
}
res <- {status = 2
otherActor ? doSomething2
}
} yield {
dest ! status
}
}
case GetStatus => sender() ! status
}
如果我發送一個DoSomething的消息,這個演員,然後立即發送到的getStatus這個演員再三,我會看到狀態0,1和2回來的序列。如果actor模型一次只處理一條消息,我只會看到狀態2被返回,因爲我不能訪問中間狀態。
看來,演員模式仍然需要鎖。我錯過了什麼?
鎖是沒有必要的。問題模式創建一個Future,此時上下文更改和GetStatus消息可以進入,也許這可能是問題。嘗試消除詢問操作(?)並再試一次。 – EmiCareOfCell44
@ EmiCareOfCell44這是我認爲可能發生的事情。然而,在一個使用許多阿卡結構的系統中,有很多'問'和其他未來的操作。所以看起來行動者似乎並不解決併發問題,除非他們不在期貨上操作,這可能不是現實的情況。 – Erix
在這種情況下,我不會使用演員內部的問題。如果接收方法必須發送其他消息,我將使用tell(!)來代替。如果你需要知道「otherActor」中發生了什麼,這應該發回你需要處理的其他消息來添加另一個'case'子句。應該避免使用可變狀態的期貨。 – EmiCareOfCell44