2016-12-20 3 views
0

私はScalaでakkaアクターを使用しています。私は受け取ったメッセージを処理している間に定期的に他のメッセージのためにそのメールボックスをチェックし、このメッセージに続いてその変数を変更することができるアクターを持つ方法があるかどうかを知りたい。定期的にアクターのメールボックスをチェックし、scalaの変数を変更する方法

のようなスキーム:

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

これはできません。アクターは一度に1つのメッセージ*を処理します。これは、並行環境における安全な変更可能な状態を保証する方法です。 – Ryan

答えて

0

何もあなたが俳優の内側に、未来を使用して、別のスレッドに長い実行中のタスクを移動することはできませんと言いません。あなたの俳優は、メールボックスのメッセージには引き続き応答し、別のスレッドは処理を妨害します。コールバックを将来設定し、タスクを正常終了させることができます。

+0

アクターの状態をコールバックから変更することは、非常に危険であり、実行されるべきではないことに注意してください。 – Ryan

+0

私はFuturesを使いたくないので、私はすでにそれらを試しています。その結果、私が現在書いているコードは、そのシングルコアバージョンよりも遅いです。いつでも私のメールボックスにアクセスするか、同じシステム内の2人の異なるアクターの変数にアクセスしたいと思います。 – Noowada

+0

@ user1834705これは不可能です。 – Ryan

関連する問題