Frage

Ich habe einen ziemlich Standard-Mechanismus in Java zur Lösung des Problems:

  • Arbeitselemente müssen so geplant werden zu einem bestimmten Zeitpunkt ausführen
  • Jede Arbeitsposition muss dann auf eine Bedingung warten immer true
  • Workitems sollte kündbaren

Die Lösung, die ich verwende, ist wie folgt:

    Haben
  1. ein Single-Thread-Scheduler zu planen meine Arbeit Artikel
  2. Haben Sie einen ExecutorService (die multi-threaded sein kann)
  3. Jede geplante Arbeitselement trägt dann die eigentliche Arbeit an den ExecutorService. Die zurück Future wird in einer Karte zwischengespeichert. Ein Abschluss-Dienst wird verwendet, um die Zukunft aus dem Cache zu entfernen, wenn die Arbeit abgeschlossen ist
  4. Produkte können über die im Cache-Futures
  5. abgebrochen werden

Natürlich, mein Testamentsvollstrecker muss mindestens so groß wie die Anzahl der blockierenden Workitems ich muss erwarten sein, aber das ist kein Problem in der Praxis.

So, jetzt ich bin Codierung in Scala und mit dem Schauspieler Rahmen. Vorausgesetzt, dass mein Arbeitselement in einer Veranstaltung an einen Schauspieler gesendet verkapselt werden:

  1. Welcher Mechanismus würde ich ein Workitem für eine bestimmte Zeit planen?
  2. Wenn ein Workitem ist ein Ereignis an einen Schauspieler geschickt, wie kann ich sicherstellen, dass die Träger Thread-Pool ist größer als die Anzahl der Elemente, die zur gleichen Zeit blockieren können
  3. Wie kann ich ein zuvor geplanter Workitem verursacht abgesagt werden?
War es hilfreich?

Lösung

  

Welcher Mechanismus würde ich ein Arbeitselement für eine bestimmte Zeit zu planen verwenden, um?

Ich möchte einen java.util.concurrent.ScheduledExecutorService verwenden.

  

Wenn ein Workitem ist ein Ereignis an einen Schauspieler geschickt, wie kann ich sicherstellen, dass die Träger Thread-Pool ist größer als die Anzahl der Elemente, die zur gleichen Zeit blockieren können

Das scheint mir ein Design, das die Anstrengungen der Parallelisierung besiegt. Versuchen Sie, zu minimieren oder Sperrung und globalen Zustand zu beseitigen. Dies sind Hindernisse für die Kombinierbarkeit und Skalierbarkeit. Betrachten wir zum Beispiel einen einzelnen dedizierten Gewinde, die für Dateien wartet ankommen und dann löst Ereignisse aus, um Schauspieler. Oder bei java.nio sucht asynchrones non-blocking I / O.

Das verstehe ich nicht vollständig Ihre Anforderungen hier, aber es scheint, als ob Sie einen einzigen Thread / Schauspieler für I / O-Ereignisse suchen haben könnte. Dann als geplant „Workitems“, planen Effekte, die nicht blockierende Akteure schaffen. Haben diese Akteure registrieren sich mit dem I / O-Thread / Aktor-Nachrichten empfangen über I / O-Ereignisse über die sie sich interessieren.

  

Wie kann ich bewirken, dass ein zuvor geplanter Workitem abgesagt werden?

ScheduledExecutorService kehrt Futures. Was Sie haben, ist kein schlechtes Design in dieser Hinsicht. Sammeln Sie sie in einer Karte und rufen future.cancel ().

Andere Tipps

Sie könnten einen Scheduling-Schauspieler, die eine Liste der geplanten Akteure haben, und verwendet Actor.receiveWithin () jede Sekunde aufwachen oder so und Nachrichten an Akteure senden, die bereit sind, ausgeführt werden. Der Schauspieler Planung könnte auch Cancelling behandeln. Eine weitere Option ist jeder Schauspieler behandelt ihre eigene Terminplanung direkt mit receiveWithin (), statt Zentralisierung Planung zu lassen.

Es gibt einige Diskussionen zu diesem Thema in der Blog-Post Einfacher cron wie Scheduler in Scala .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top