5

私が理解しているように、中断するScala Actors ことはできません。タイムアウトのあるタスクがあるとします。タスクがタイムアウト内に終了しない場合は、停止する必要があります。

タスクが割り込み可能であると仮定します(たとえば、割り込み可能なチャネルでブロッキング i/o を実行します)。Java では、別のスレッドでタスクを実行し、タイムアウト時にスレッドを中断できます。

私はそれを行うことができますScala Actorsか?代わりに Java スレッドを使用する必要がありますか?

4

1 に答える 1

2

アクター モデルに正確に従えば、アクターを中断することはできません。つまり、共有したくない場合です。これは、たとえば AtomicBoolean を使用してAkka アクターの回答をキャンセルする方法で提案されています。

ただし、一般的な答えは、アクター内で Java スレッド化イディオムを使用しようとしているということです。これは間違っています。タスクを長時間実行するのではなく、作業を小さなバッチに分割する必要があります。

Akka のドキュメント、Actor Best Practicesから:

アクターは素敵な同僚のようであるべきです。他の人に不必要に迷惑をかけることなく効率的に仕事をし、リソースを浪費しないようにします。プログラミングに翻訳すると、これはイベントを処理し、イベント駆動型の方法で応答 (または複数の要求) を生成することを意味します。アクターは、やむを得ない場合を除き、何らかの外部エンティティ (ロック、ネットワーク ソケットなど) をブロック (つまり、スレッドを占有している間、受動的に待機) すべきではありません。後者の場合は、以下を参照してください。

Scala アクターでこれを行うことはできますか? いいえ、問題は概念的な性質のものであり、フレームワークの実装とは関係がないため、同じ問題に遭遇します。

代わりに Java スレッドを使用する必要がありますか? Java スレッドのイディオムに従いたい場合は、そうです。しかし、アクターの同時実行を使用する場合は、すべてのメリットを享受するために別の思考モデルを採用する必要があります。

于 2013-04-11T12:22:13.820 に答える