Ich muss in einer interaktiven Anwendung CPU-lastige Jobs mit mehreren Aufgaben verwalten. Genau wie Hintergrund ist meine spezifische Anwendung eine Schnittstelle des Technikdesigns. Wenn ein Benutzer verschiedene Parameter und Optionen an ein Modell ändert, werden mehrere Simulationen im Hintergrund ausgeführt, und die Ergebnisse werden nach ihrer Fertigstellung angezeigt, wahrscheinlich sogar, wenn der Benutzer noch Werte bearbeitet. Da die multiplen Simulationen eine variable Zeit benötigen (einige sind Millisekunden, manche 5 Sekunden, manche 10 Minuten), geht es darum, möglichst schnell eine Rückmeldung zu erhalten, aber oft abgebrochene Jobs, die zuvor gestartet wurden, aber jetzt nicht mehr benötigt werden der Änderungen des Benutzers haben sie bereits ungültig gemacht. Unterschiedliche Benutzeränderungen können unterschiedliche Berechnungen ungültig machen, so dass zu jeder Zeit 10 verschiedene Simulationen ausgeführt werden können. Die Simulationen A und B können separat berechnet werden, aber ich benötige ihre Ergebnisse für die Simulation C, so dass ich darauf warten muss, dass sowohl A als auch B vor dem Start C enden.Multithread-Jobwarteschlangenmanager
Ich fühle ziemlich sicher, dass die Code-Level-Methode, um diese Art von Anwendung zu behandeln, eine Art von Multithread-Auftragswarteschlange ist. Dazu gehören Funktionen zum Übergeben von Jobs zur Ausführung, Festlegen von Aufgabenprioritäten, Warten auf den Abschluss von Jobs, Festlegen von Abhängigkeiten (diesen Job ausführen, aber erst nachdem Job X und Job Y beendet wurden), Abbrechen von Teilmengen von Jobs, die bestimmten Kriterien entsprechen Jobs bleiben bestehen, legen die Anzahl der Worker-Threads und -Prioritäten fest und so weiter. Und Multiplattform-Unterstützung ist auch sehr nützlich.
Dies sind keine neuen Ideen oder Wünsche in Software, aber ich bin in der frühen Entwurfsphase meiner Anwendung, wo ich eine Auswahl treffen muss, welche Bibliothek für die Verwaltung solcher Aufgaben verwendet werden soll. Ich habe meine eigenen groben Thread-Manager in der Vergangenheit in C geschrieben (ich denke, es ist ein Übergangsritus), aber ich möchte meine Arbeit auf moderne Tools stützen, nicht auf meine eigenen vorherigen Hacks.
Der erste Gedanke ist zu OpenMP laufen, aber ich bin mir nicht sicher, was ich will. OpenMP eignet sich hervorragend zum Parallelisieren auf einem feinen Level, zum automatischen Ausrollen von Loops und ähnlichem. Während Multiplattform, dringt es auch mit #pragmas in Ihren Code ein. Aber meistens ist es nicht für die Verwaltung großer Aufgaben ausgelegt. Insbesondere können ausstehende Jobs abgebrochen oder Abhängigkeiten angegeben werden. Möglich, ja, aber es ist nicht elegant.
Ich bemerkte, dass Google Chrome uses such a job manager for even the most trivial tasks. Das Entwurfsziel scheint zu sein, den Benutzerinteraktion Thread so leicht und flink wie möglich zu halten, so dass alles, was asynchron hervorgebracht werden kann, sein sollte. Aus der Betrachtung der Chrome-Quelle scheint dies keine generische Bibliothek zu sein, aber es ist dennoch interessant zu sehen, wie das Design asynchrone Starts verwendet, um die Interaktion schnell zu halten. Das wird ähnlich wie das, was ich mache.
Es gibt noch andere Optionen:
Surge.Act: eine Boost-artige Bibliothek für Jobs definieren. Es baut auf OpenMP auf, erlaubt aber die Verkettung von Abhängigkeiten, was gut ist. Es scheint nicht so zu sein, als ob es einen Manager gibt, der befragt werden kann, Jobs abgesagt werden usw. Es ist ein abgestandenes Projekt, also ist es beängstigend, sich darauf zu verlassen.
Job Queue ist ziemlich nah an dem, was ich denke, aber es ist ein 5 Jahre alter Artikel, keine unterstützte Bibliothek.
Boost.threads hat eine schöne plattformunabhängige Synchronisation, aber das ist kein Jobmanager. POCO hat sehr saubere Designs für den Start von Aufgaben, aber auch nicht ein voller Manager für die Verkettung von Aufgaben. (Vielleicht unterschätze ich POCO allerdings).
So, während es Optionen gibt, bin ich nicht zufrieden und ich fühle den Drang, meine eigene Bibliothek wieder zu rollen. Aber ich würde lieber etwas verwenden, das bereits existiert.Selbst nach dem Suchen (hier auf SO und im Internet) habe ich nichts gefunden, was sich richtig anfühlt, obwohl ich mir vorstelle, dass dies eine Art von Werkzeug sein muss, das oft benötigt wird, also gibt es sicherlich eine Gemeinschaftsbibliothek oder zumindest gemeinsames Design. Auf SO gab es einige posts über job queues, aber nichts, das zu passen scheint.
Meine Post hier ist, Sie alle zu fragen, welche vorhandenen Werkzeuge ich vermisst habe, und/oder wie Sie Ihre eigene solche Multithread-Auftragswarteschlange gerollt haben.
Excellent. boost :: future sieht POCOs ActiveResults (http://pocoproject.org/poco/docs/Poco.ActiveResult.html) sehr ähnlich. Auch dies ist kein Manager für die Arbeitswarteschlange, aber trotzdem ein großartiges Werkzeug. Boost: Thread-Basis fühlt sich wie das beste Low-Level-Toolkit für die Erstellung eines benutzerdefinierten Managers an. –