2012-03-14 15 views
13

ちょうどスカラの俳優を始めています。 Scala websiteは言う:Scala Actors:反応が返ってこない場合、なぜループ{}になる必要があり、なぜwhile(true)は機能しないのですか?

スレッドブロック操作は 新しいメッセージ(receiveのイベントベースのペンダント)を待つreactを使用することによって回避することができます。ただし、 (通常は小額)の代金があります。reactは返品されません。

...

whileループ内reactを使用して動作しないことに注意してください!しかし、 ループは一般的なので、loopという形式の という形式の特別なライブラリサポートがあります。私は今、混乱している

loop { 
    react { 
    case A => ... 
    case B => ... 
    } 
} 

- 矛盾があるように思われる:このように使用することができますreactは決して戻らない場合は

a)は、ループ内でそれを置くのポイントは何でしょう?なぜwhile作業を行い、どのような方法でそれが「機能しない」ん - loop以来

B)を繰り返し、それがwhile(true)に任意の異なる方法を、ブロックを実行しますか?

答えて

11

両方の機能、loopおよびreactは純粋ではありません。 loopは名前パラメータで呼び出され、reactはPartialFunctionであり、両方とも未処理のアクタに設定されています。これは、アクタにはスレッドが常時接続されていないためです。メッセージボックスにメッセージがある場合にのみアクティブになります。これは、while(true)が100%CPU使用率につながり、アクターが応答しない理由です。

+0

Scalaウェブサイトの説明に欠けている部分は、 'react'が_normally_を返さないということですが、まだ終了しています(Exceptionを経由している可能性があります)。 – DNA

+0

私はそれが「欠けている部分」だとは思わない。これは実装の詳細であり、開発者にとっては無関係です。関連情報はwhile(true)が機能しないことです。しかし、詳細に興味がある場合は、ソースを見ることができますが、よく理解しています。 – drexin

+2

レシピに従うだけでは無関係かもしれませんが、説明の中で大きな障害となっていました。何かが返ってくるかどうかは実装の詳細ではありません(ループ/リピートしようとしている場合) - 絶対に基本的な!私は質問をする前にソースをすばやく見ましたが、少し深く掘り下げるためにあなたの助言に従います... – DNA

1

私はone of Haller and Odersky's papers on Actorsで一部に答える説明私の質問のa)のを、(以下私の重視)が見つかりました:

次のように中心的な考えがある:受信 文で待機俳優はありますブロックされたスレッドでは表現されませんが、 が残りのアクタの計算をキャプチャするクロージャによって処理されます。受信に指定されたメッセージ の1つに一致するメッセージがアクタに送信されると、閉鎖が実行されます( )。クロージャの実行は \ピギーバック」差出人のスレッドである。

受信閉鎖 終了、制御は手順 戻っているかのように送信者に返送された場合。で受け閉鎖ブロックした場合受信、制御 が レシーバのコール・スタックを戻し特別な例外をスローすることによって、送信者に返されます。

二 仕事へのスキームのために必要な条件は、受信機がその外側の俳優に通常を返さないことです。 つまり、アクター内のコードは、終了ブロックに依存することはできません。または、 受信ブロックの結果...

+0

私はあなたに合うかもしれない開発/コンサルティングプロジェクトに関してあなたに連絡する方法が得られるかどうかを見たいと思っていましたスキル手を差し伸べるにはどうすればよいでしょうか? – Jeremy

+0

私のプロフィールは連絡先メールを持っています - しかし、私は完全に現在占領されています、ごめんなさい。 – DNA

関連する問題