質問

Scala でアクターを使用することに少し不安を感じます。やり方についてのドキュメントは読みましたが、それらを自由に使用するには、いくつかの「禁止」ルールも必要だと思います。間違った使い方をしてしまうのが怖くて気づかないのだと思います。

適用した場合、Scala アクターがもたらす利点を損なう、または誤った結果さえももたらす可能性のあるものを思いつきますか?

役に立ちましたか?

解決

  • 避ける !? 可能な限り。あなた 意思 ロックされたシステムを手に入れましょう!

  • メッセージは常にアクター サブシステム スレッドから送信してください。これが一時的なアクタを作成することを意味する場合、 Actor.actor メソッドの場合は次のようになります。

    case ButtonClicked(src) => Actor.actor { controller ! SaveTrade(trdFld.text) }

  • を追加 「その他のメッセージ」 アクターの反応に対するハンドラー。そうしないと、間違ったアクターにメッセージを送信しているかどうかを判断することができません。

    case other => log.warning(this + " has received unexpected message " + other

  • 使用しないでください Actor.actor 主要な俳優、サブキャス向け Actor その代わり。その理由は、サブクラス化することによってのみ、適切な機能を提供できるためです。 toString 方法。繰り返しになりますが、ログに次のようなステートメントが散在している場合、アクターのデバッグは非常に困難になります。

    12:03 [INFO] Sending RequestTrades(2009-10-12) to scala.actors.Actor$anonfun$1

  • システム内のアクターを文書化し、どのメッセージを受信するか、および応答をどのように計算するかを正確に示します。アクターを使用すると、標準プロシージャ (通常はメソッド内にカプセル化されている) が変換され、複数のアクターの反応にまたがるロジックに変換されます。適切な文書がないと道に迷ってしまいがちです。

  • 常に、アクターの外部でコミュニケーションできることを確認してください。 react ループしてその状態を見つけます。たとえば、私は常に、メソッドを介して呼び出されるように宣言します。 MBean これは次のコード スニペットのようになります。そうしないと、アクターが実行中か、シャットダウンしたか、大量のメッセージ キューがあるかなどを判断するのが非常に困難になる可能性があります。

.

def reportState = {
  val _this = this
  synchronized {
    val msg = "%s Received request to report state with %d items in mailbox".format(
                   _this, mailboxSize) 
    log.info(msg)
  }
  Actor.actor { _this ! ReportState }
}
  • アクターをリンクして使用します trapExit = true - そうしないと、プログラムが意図したとおりに動作せず、メッセージが攻撃者のメールボックスに残るためメモリ不足になる可能性があり、何も通知せずに失敗する可能性があります。

  • アクターを使用して行われるデザイン上の決定に関して、他にもいくつかの興味深い選択が強調されていると思います。 ここ そして ここ

他のヒント

これが質問に対する本当の答えではないことは承知していますが、少なくとも、メッセージ ベースの同時実行は、共有メモリ スレッド ベースの同時実行よりも奇妙なエラーが発生する可能性がはるかに低いという事実を心に留めておく必要があります。

俳優のガイドラインをご覧になったと思います。 Scala でのプログラミング, 、ただし記録のために:

  • アクターはメッセージの処理中にブロックすべきではありません。ブロックしたい場合は、後でメッセージを受け取るように手配してください。
  • 使用 react {} それよりも receive {} 可能であれば。
  • 俳優とのコミュニケーションはメッセージのみで行ってください。
  • 不変のメッセージを好みます。
  • メッセージを自己完結型にします。
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top