2016-12-20 46 views
0

我在Scala中使用akka演員。我想知道是否有辦法讓演員在處理收到的消息時可以定期檢查其郵箱中的其他消息,並在此消息後可以更改其變量。如何定期檢查演員郵箱並更改scala中的變量

如A方案:

class Actor1 (constructors){ 

    def receive={ 
     case "go" => run()  //the actor starts 
     case "alter variables" // a new message is stashed in mailbox 
    } 

    def run={ 
     //do stuff 
     check(mailbox) //while the porocessing of the "go" message 
        // is not finished 
     if ("alter variables" in mailbox) { 
      change a variable value 
     } 
    } 

}

+0

我不知道你爲什麼想這樣做,但我認爲這會打破Akka試圖強制執行的設計模式,所以我不鼓勵這樣做。通過實現你自己的隊列,你可以通過實現自己的隊列來安裝類似的東西,並且有一些其他的機制來檢查隊列。 – childofsoong

+0

這是不可能的。參與者一次處理*一條消息*。這是他們如何保證併發環境中安全的可變狀態。 – Ryan

回答

0

沒有說你不能移動長時間運行的任務分解成不同的線程,使用未來,一個演員裏面。您的演員會繼續回覆郵箱中的郵件,而另一個線程則會處理您的郵件。您可以設置未來的回調,並讓任務正常完成。

+0

請注意,從回調中修改actor的狀態是非常非常非常危險的,應該永遠不要做。 – Ryan

+0

我不想使用期貨,因爲我已經嘗試了它們,結果我目前寫的代碼比單核版本慢。我想隨時訪問我的郵箱,或者訪問同一系統中兩個不同角色的變量。 – Noowada

+0

@ user1834705這是不可能的。 – Ryan