Frage

ich fühle mich ein wenig unsicher über Schauspieler in Scala mit. Ich habe Dokumentation darüber lesen, wie Dinge zu tun, aber ich denke, ich auch einige DO Regeln NICHT um sich frei zu fühlen brauchen würde, sie zu nutzen. Ich glaube, ich fürchte, dass ich sie in einer falschen Weise nutzen werden, und ich werde es nicht einmal bemerken.

Können Sie sich etwas, das, wenn angewendet, brechen die Vorteile zur Folge hätte, dass Scala Akteure bringen oder sogar falsche Ergebnisse?

War es hilfreich?

Lösung

  • Vermeiden Sie !? , wo immer möglich. Sie wird ein gesperrtes System erhalten!

  • Immer eine Nachricht von einem Schauspieler-Subsystem-Thread senden. Wenn dies bedeutet einen vorübergehenden Schauspieler über die Actor.actor Verfahren zu schaffen, dann soll es so sein:

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

  • Fügen Sie ein "eine andere Meldung" Handler Reaktionen Ihre Schauspieler. Sonst ist es unmöglich, herauszufinden, ob Sie eine Nachricht an den falschen Schauspieler senden:

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

  • Verwenden Sie Actor.actor nicht für Ihre primäre Akteure, sublcass Actor statt. Der Grund dafür ist, dass es nur durch Subclassing, dass Sie eine vernünftige toString Methode zur Verfügung stellen können. Auch hier ist Schauspieler Debuggen sehr schwierig, wenn Ihre Protokolle mit Aussagen übersät sind wie:

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

  • Dokument die Akteure in Ihrem System, die besagt ausdrücklich, welche Nachrichten sie erhalten und wie genau sollten sie die Antwort berechnen. Akteure Ergebnisse bei der Umwandlung von einem Standard-Verfahren unter Verwendung von (in der Regel innerhalb eines Verfahrens verkapselt) -Logik Ausbreitung über mehrere Schauspieler Reaktionen zu werden. Es ist leicht, ohne eine gute Dokumentation verirren.

  • Achten Sie darauf, Sie mit Ihrem Schauspieler außerhalb seiner react Schleife kommunizieren kann seinen Zustand zu finden. Zum Beispiel habe ich erkläre immer, ein Verfahren über ein MBean aufgerufen werden, die wie der folgenden Codeausschnitt aussieht. Es kann sonst sehr schwer zu sagen, wenn Ihr Akteur läuft, wird heruntergefahren, hat eine große Warteschlange von Nachrichten usw.

.

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 }
}
  • Link Ihre Akteure zusammen und Verwendung trapExit = true -. Andernfalls können sie nicht Ihr Programm im Stillen bedeutet nicht das tun, was Sie denken, es ist und wird wahrscheinlich von Speicher gehen als Nachrichten in der Mailbox des Schauspieler bleiben

  • Ich denke, dass einige andere interessante Entscheidungen rund um Design-Entscheidungen getroffen werden Akteure mit, sind besonders hervorgehoben hier und hier

Andere Tipps

Ich weiß, das ist wirklich nicht die Frage beantworten, aber man sollte zumindest ein Herz fasst in der Tatsache, dass meldungsbasierte Parallelität ist viel weniger anfällig für Fehler wierd als Shared-Memory-Thread-basierter Parallelität.

Ich nehme an, Sie haben die Schauspieler Richtlinien gesehen in Programmierung in Scala , aber der Ordnung halber:

  • Akteure blockieren sollte nicht während eine Nachricht verarbeiten. Wo Sie könnten blockieren möchten versuchen, eine Nachricht zu erhalten, zu arrangieren später statt.
  • Verwenden Sie react {} statt receive {}, wenn möglich.
  • Kommunizieren mit Schauspielern nur über Nachrichten.
  • Bevorzugen unveränderliche Nachrichten.
  • Make-Nachrichten in sich abgeschlossen.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top