Teilen stdout zwischen mehreren threads/Prozessen
Ich habe ein linux-Programm(die Sprache spielt dabei keine Rolle), die gedruckt log auf stdout.
Das Protokoll IST erforderlich für die überwachung des Prozesses.
Nun ich werde parallelisieren es durch die Gabel ' Ing oder mit threads.
Das problem: die resultierende stdout enthalten nicht lesbare Mischung von nicht verwandten Linien...
Und schließlich Die Frage: Wie würden Sie re-konstruieren die output-Logik für parallele Prozesse ?
- Willst du split-log-ins getrennt pro Prozess/thread meldet, oder tun Sie nur wollen, zu vermeiden, mischen Ausgabe von mehreren Prozessen innerhalb einer Zeile?
- Es sollten visuell getrennt pro Prozess. So könnte der Benutzer zu verstehen, den status jeder Aufgabe. Atomic Linien ist ein kleines problem, ich werde einfach einige Synchronisations-Objekt.
- Kennzeichnen Sie Ihre log-Zeilen mit etwas eindeutig pro Prozess, z.B.
[process-$PID]
oder[roleOfTheProcess]
? - +1 Als eine der möglichen Ansätze... Noch auf der Suche nach einer Methode zur Trennung der Ausgang in sub-Protokolle, die pro Prozess.
- Sie können tag und später filtern nach tags in sublogs
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sorry für die Beantwortung von mir...
Die definitive Lösung war die Verwendung der GNU parallel - Dienstprogramm.
Kam es zu ersetzen, die bekannten
xargs
- Dienstprogramm, sondern führt die Befehle parallel, indem Sie die Ausgabe in Gruppen.So, ich verließ mein einfaches Verfahren, ein-thread-Programm-ist und leiten seinen Aufruf durch die
parallel
so:Diese, je nach parallel-Optionen produzieren kann schön gruppiert Ausgänge für mehrere Aufrufe von
my-utility
Wenn Sie in C++ würde ich erwägen, Pantheios oder abgeleitete version von Boost::Anmelden oder mit Blick auf Logging In C++ : Teil 2 oder
Wenn Sie in einer anderen Sprache dann Datei sperren, um die E /a-Operationen ist wahrscheinlich der Weg zu gehen, sehen Datei Sperren, können Sie die gleichen Ergebnisse erzielen mit semaphonres oder andere Prozess-Steuerung, aber für mich Dateisperren sind die einfachsten.
Könnte man auch erwägen, syslog wenn diese überwachung ist als system breit.
Anderen Ansatz, die wir verwenden, ist delegieren ein thread, logger-thread für die Anmeldung. Alle anderen threads zu wollen-log-senden-logger-thread. Diese Methode gibt Ihnen die Flexibilität, wie die Formatierung der logs, die getan werden kann, ist eine einzige Stelle, die auch konfigurierbar sein. Wenn Sie nicht wollen, zu kümmern, können die sperren verwenden, sockets, message-passing.
Wenn Ihr Multithread, dann werden Sie brauchen, um mutex zu schützen drucken/schreiben auf die Standardausgabe protokollieren. Der häufigste Weg, um dies in Linux und c/c++ ist mit pthread_mutex. Darüber hinaus, wenn Ihre c++, boost, hat die Synchronisation verwendet werden konnten.
Implementieren, sollten Sie vielleicht Kapseln alle logging in eine Funktion oder ein Objekt, und intern sperren und entsperren des mutex.
Wenn die Protokollierung blockierende Leistung wird unerschwinglich, könnten Sie überlegen, ob die Pufferung der log-Meldungen (in den vorgenannten Objekt oder Funktion) und nur das schreiben auf stdout, wenn der Puffer voll ist. Du musst noch mutex-Schutz, auf Puffer, aber die Pufferung wird schneller sein als das schreiben auf stdout.
Wenn jeder thread seine eigene logging-Nachrichten, dann werden Sie noch brauchen, um alle den gleichen mutex für das schreiben auf stdout. In diesem Fall wäre es wahrscheinlich am besten für jeden thread Puffer seine jeweiligen log-Meldungen und nur nach stdout schreiben, wenn der Puffer voll ist, also nur um den Erhalt der mutex für das schreiben auf stdout.