Log-Ausgabe mitverfolgen
Verfasst: Dienstag 8. Mai 2012, 17:57
Es gibt ein Simulationsprogramm, dessen Läufe von einem in Python geschriebenen Framework mittels subprocess gestartet wird. Anschließend wird die Ausgabe der Simulation über stdout geparst und das Ergebnis in eine Datenbank geschrieben. Das Framework ist mittels RPC-Aufrufen steuerbar. Es nimmt eine Befehlgruppe entgegen und führt dann die Befehle parallel aus.
Eine Webanwendung greift auf die Daten aus der Datenbank zu und stellt sie dem Benutzer zur Verfügung.
Zur Hierachie des RPC-Servers:
Der RPC-Server nimmt neue Jobs entgegen und packt sie in eine Queue. Ein (in seinem eigenen Thread laufender) Taskmanager entnimmt Aufträge aus der Queue und erstellt zu jeder Auftragsgruppe einen ResultHandler, und für jede Aufgabe einen neuen Task (der dann den Popen-Aufruf vornimmt). Sowohl ResultHandler als auch die Tasks laufen in ihrem eigenen Thread. Der ResultHandler verfügt über eine Queue, in die die Tasks nach beenden ihreres Jobs das Ergebnis packen. Der ResultHandler entnimmt die Ergebnisse, trägt diese in die Datenbank ein und verschickt am Ende eine Email.
Das Problem:
Es soll nun möglich sein, die Ausgabe des ``Popen``-Aufrufs live und asynchron mitverfolgen zu können. Das heißt, man kann sich dann in eine Ausführung nachträglich dazuschalten und die Ausgabe mitgeteilt bekommen. Das ganze möchte ich nun möglichst leichtgewichtig implementieren.
Meine Idee wäre jetzt einen neuen Handler zu erstellen, der mit einer neuen Queue die Zeilen der Ausgabe von den Tasks erhält und sich dann um das Broadcasting kümmert. Gibt es vielleicht einen eleganteren Weg? Ich weiß nicht, wie man am Besten mit hängenden Verbindungen umgehen soll. Zumal eine Zeile zwischen Millisekunden und mehreren Stunden generiert werden kann.
Eine Webanwendung greift auf die Daten aus der Datenbank zu und stellt sie dem Benutzer zur Verfügung.
Zur Hierachie des RPC-Servers:
Der RPC-Server nimmt neue Jobs entgegen und packt sie in eine Queue. Ein (in seinem eigenen Thread laufender) Taskmanager entnimmt Aufträge aus der Queue und erstellt zu jeder Auftragsgruppe einen ResultHandler, und für jede Aufgabe einen neuen Task (der dann den Popen-Aufruf vornimmt). Sowohl ResultHandler als auch die Tasks laufen in ihrem eigenen Thread. Der ResultHandler verfügt über eine Queue, in die die Tasks nach beenden ihreres Jobs das Ergebnis packen. Der ResultHandler entnimmt die Ergebnisse, trägt diese in die Datenbank ein und verschickt am Ende eine Email.
Das Problem:
Es soll nun möglich sein, die Ausgabe des ``Popen``-Aufrufs live und asynchron mitverfolgen zu können. Das heißt, man kann sich dann in eine Ausführung nachträglich dazuschalten und die Ausgabe mitgeteilt bekommen. Das ganze möchte ich nun möglichst leichtgewichtig implementieren.
Meine Idee wäre jetzt einen neuen Handler zu erstellen, der mit einer neuen Queue die Zeilen der Ausgabe von den Tasks erhält und sich dann um das Broadcasting kümmert. Gibt es vielleicht einen eleganteren Weg? Ich weiß nicht, wie man am Besten mit hängenden Verbindungen umgehen soll. Zumal eine Zeile zwischen Millisekunden und mehreren Stunden generiert werden kann.