2009-10-24 14 views
15

Kann ich die maximale Größe für das Postfach eines Akteurs in Scala festlegen?Mailbox-Größenbeschränkung für Scala

Nehmen Sie das Producer-Consumer-Problem. Mit Threads kann ich die Produzenten blockieren, wenn der Puffer voll ist. Ich habe ein paar Producer-Consumer-Beispiele gesehen, die in Scala geschrieben wurden und alle benutzen Aktoren mit Postfächern, die als "Puffer" benutzt werden. Kann ich die Postfachgröße so einstellen, dass die Produzenten warten, bis ein Verbraucher bereit ist? Irgendeine andere elegante Lösung, um unkontrollierbares Wachstum der Postfächer zu vermeiden?

Antwort

16

Sie können einen Akteur erstellen, der als Puffer zwischen Hersteller und Verbraucher fungiert. Der Puffer prüft sein Postfach auf seine Schleifendaten. Er sendet eine "Überlast" -Nachricht an den Hersteller zurück, wenn die Anzahl der gepufferten Produkte zu hoch ist; und sendet eine "klare" Nachricht, sobald alles wieder in Ordnung ist. Im Falle von zu vielen Nachrichten werden einfach eingehende (oder älteste) gelöscht.

Der Verbraucher fordert aktiv Produkte aus dem Puffer, die wiederum ein Produkt zurücksenden. Wenn der Puffer leer ist, wartet der Verbraucher auf die Eingabe.

Der Produzent sendet Produkte zum Pufferaktor. Wenn es eine "Überlastungs" -Nachricht erhält, kann es die Produktion stoppen, oder es kann weiterhin produzieren, wobei es die Tatsache kennt, dass die Produkte fallengelassen werden könnten.

Natürlich könnte diese Logik direkt in den Hersteller oder Verbraucher selbst implementiert werden, aber ein separater Puffer ermöglicht es Ihnen, mehrere Produzenten und/oder Konsumenten einfacher einzuführen.

5

Die Methode Actor.mailboxSize gibt die Anzahl der ausstehenden Nachrichten im Postfach des Actors zurück.

Dies kann zum Drosseln des Herstellers auf verschiedene Arten verwendet werden.

Zum Beispiel könnte eine Möglichkeit sein,

Der Hersteller prüft, ob der Verbraucher mailboxSize größer ist als eine bestimmte Schwelle. Wenn dies der Fall ist, sendet es eine SpecialMessage an den Verbraucher und blockiert auf einem Semaphor. Wenn der Verbraucher diese SpecialMessage empfängt, gibt es den Semaphor frei. Der Produzent kann nun fröhlich weitermachen.

Dadurch wird sowohl das Abrufen als auch das Löschen von Nachrichten vermieden.

+1

Polling scheint mir passender, als den Briefkasten des Verbrauchers zu einem "geteilten Staat" zwischen zwei Schauspielern zu machen. – Zed

+1

Polling ist oft aus einer reinen Programmierperspektive besser, aber Semaphore sind oft besser aus Sicht der Hardware-Nutzung. Hängt von Ihrer genauen Situation ab, welche ausgewählt werden sollte. –

+0

@Zed Das Postfach des Kunden ist ein gemeinsamer Status! Sonst könnte der Produzent keine Nachrichten senden :) – HRJ