Zeitplaner in Rxcpp

8

Ich versuche herauszufinden, das Zeitplanungsmodell in der C ++ Version von Rx.

Kenntnis der C # -Version, in der es eine einfache Schnittstelle mit einer Schedule-Methode gibt; Die C ++ - Version scheint ziemlich komplex zu sein, mit Dingen wie Scheduler, Worker und Koordination.

Ein wichtiges fehlendes Stück für mich ist eine Implementierung eines Thread-Pool-Schedulers, existiert sie mit einem anderen Namen? Wie würde ich es selbst umsetzen? Soll ich es über PPL (Windows) schreiben? Wenn ich einen serialisierten (Actor like) Beobachter darüber brauche, was soll ich verwenden? Spähen hier und hier kann zeigen, dass dies keine triviale Aufgabe ist.

Es würde wirklich helfen, einen Überblick über das Thema zu bekommen, da die offizielle Dokumentation automatisch generiert wird und immer noch vorhanden ist wirklich spärlich.

    
Michael Sutton 17.05.2015, 20:58
quelle

1 Antwort

6

Ja, die generierten Dokumente sind neu und die Planung ist noch nicht dokumentiert.

Der Scheduler in rxcpp v2 basiert auf den Scheduler- und Worker-Konstrukten, die RxJava verwendet (Eric Meijer war beteiligt) Die Dokumentation für RxJava enthält eine Erklärung für Scheduler und Worker. rxcpp fügt scheduling, Koordination und Koordinator hinzu.

scheduler besitzt eine Zeitleiste, die mit der Methode now() verfügbar gemacht wird. scheduler ist auch eine Factory für worker s in dieser Zeitleiste. Da ein Scheduler eine Timeline besitzt, ist es möglich, Scheduler zu erstellen, die Zeitreisen durchführen. Der Virtual-Scheduler ist eine Basis für den Test-Scheduler, mit dem Mehr-Sekunden-Tests in ms abgeschlossen werden können.

worker besitzt eine Warteschlange mit ausstehenden schedulable s für die Zeitleiste und hat eine Lebensdauer. Wenn die Zeit für ein schedulable erreicht ist, wird schedulable ausgeführt. Die Warteschlange behält die Einfügereihenfolge bei, wenn N schedulable s dieselbe Zielzeit haben, werden sie in der Reihenfolge ausgeführt, in der sie in die Warteschlange eingefügt wurden. Der worker garantiert, dass jeder schedulable abgeschlossen ist, bevor der nächste schedulable gestartet wird. Wenn die Lebensdauer von worker abgemeldet ist, werden alle ausstehenden schedulable s verworfen.

schedulable besitzt eine Funktion und hat einen Arbeiter und ein Leben lang. Wenn die Lebensdauer von schedulable abgemeldet ist, wird die Funktion schedulable nicht aufgerufen. Das schedulable wird an die Funktion übergeben und ermöglicht es der Funktion, sich selbst neu zu planen oder etwas anderes auf demselben Arbeiter zu planen.

Die neuen Konzepte sind Koordination und Koordination. Ich fügte diese hinzu, um Operatorimplementierungen zu vereinfachen und Pay-for-Use in Operatorimplementierungen einzuführen. Insbesondere in Rx.NET und RxJava verwenden die Operatoren atomare Operationen und Synchronisationsprimitive, um Nachrichten aus mehreren Streams zu koordinieren, selbst wenn sich alle Streams im selben Thread befinden (wie UI-Ereignisse). Die identity_. . . -Koordinationen in rxcpp werden standardmäßig verwendet und haben keinen Overhead. Die syncronize_. . . und observe_on_. . . -Koordinationen verwenden Mutex bzw. Queue-auf-a-Worker, um mehrere Streams sicher zu verschachteln.

coordination ist eine Factory für coordinator s und hat eine scheduler .

coordinator hat eine worker und ist eine Factory für koordinierte Funktionen observable s, subscriber s und schedulable .

Alle Operatoren, die mehrere Streams verwenden oder sich zeitlich damit befassen (sogar subscribe_on und observe_on), nehmen einen Koordinationsparameter, nicht einen Scheduler.

Hier sind einige Funktionen, die eine Koordination mit einem bestimmten Scheduler erzeugen.

  • identity_immediate ()
  • identity_current_thread ()
  • identity_same_worker (Arbeiter w)
  • serialize_event_loop ()
  • serialize_new_thread ()
  • serialize_same_worker (Arbeiter w)
  • observe_on_event_loop ()
  • observe_on_new_thread ()

Es gibt noch keinen Thread-Pool-Scheduler. Ein Thread-Pool-Scheduler erfordert eine Abhängigkeit von einer Thread-Pool-Implementierung, da ich keinen Thread-Pool schreiben möchte. Mein Plan ist es, einen Scheduler für den Windows-Thread-Pool und den Apple-Thread-Pool und den Boost-Asio-Executor-Pool zu erstellen. Eine zu beantwortende Frage ist, ob diese plattformspezifischen Konstrukte im rxcpp-Repo leben sollen oder plattformspezifische Repos haben / p>

Beiträge, Meinungen und Ideen sind willkommen!

    
Kirk Shoop 18.05.2015, 01:52
quelle