質問
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 }
}
他のヒント
これが質問に対する本当の答えではないことは承知していますが、少なくとも、メッセージ ベースの同時実行は、共有メモリ スレッド ベースの同時実行よりも奇妙なエラーが発生する可能性がはるかに低いという事実を心に留めておく必要があります。
俳優のガイドラインをご覧になったと思います。 Scala でのプログラミング, 、ただし記録のために:
- アクターはメッセージの処理中にブロックすべきではありません。ブロックしたい場合は、後でメッセージを受け取るように手配してください。
- 使用
react {}
それよりもreceive {}
可能であれば。 - 俳優とのコミュニケーションはメッセージのみで行ってください。
- 不変のメッセージを好みます。
- メッセージを自己完結型にします。