49

Scalaでアクターを使用することに少し不安を感じます。作業方法に関するドキュメントを読んだことがありますが、それらを自由に使用するには、いくつかの禁止ルールも必要になると思います。私はそれらを間違った方法で使用することを恐れていると思います、そして私はそれに気付くことさえありません。

適用された場合、Scalaアクターがもたらすメリットを壊したり、誤った結果をもたらしたりするようなことを考えられますか?

4

2 に答える 2

55
  • !?可能な限り避けてください。あなたロックされたシステムを手に入れるでしょう!

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

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

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

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

  • 主なアクターには使用せず、代わりActor.actorにsublcassを使用してください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 }
}
于 2009-10-12T07:44:40.980 に答える
12

これが実際には質問に答えないことは知っていますが、少なくとも、メッセージベースの同時実行性は共有メモリスレッドベースの同時実行性よりも奇妙なエラーが発生しにくいという事実に留意する必要があります。

Scalaでのプログラミングで俳優のガイドラインを見たことがあると思いますが、記録のために:

  • メッセージの処理中、アクターはブロックしないでください。ブロックしたい場合は、代わりに後でメッセージを受け取るように手配してください。
  • react {}可能な場合ではなく使用してくださいreceive {}
  • メッセージを介してのみアクターと通信します。
  • 不変のメッセージを優先します。
  • メッセージを自己完結型にします。
于 2009-10-10T22:38:37.903 に答える