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
に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 }
}
アクターをリンクして使用します。trapExit = true
そうしないと、アクターがサイレントに失敗する可能性があります。つまり、プログラムが思ったとおりに動作せず、メッセージがアクターのメールボックスに残っているため、メモリが不足する可能性があります。
アクターを使用して行われるデザイン決定に関する他のいくつかの興味深い選択がこことここで強調されていると思います
これが実際には質問に答えないことは知っていますが、少なくとも、メッセージベースの同時実行性は共有メモリスレッドベースの同時実行性よりも奇妙なエラーが発生しにくいという事実に留意する必要があります。
Scalaでのプログラミングで俳優のガイドラインを見たことがあると思いますが、記録のために:
react {}
可能な場合ではなく使用してくださいreceive {}
。