Gemeinsame Ressource ==Konflikt
Das Schreiben in eine normale Datei ist per Definition eine serialisierte Operation. Sie gewinnen keine Leistung, wenn Sie versuchen, von mehreren Threads darauf zu schreiben, E/A ist eine endliche begrenzte Ressource mit einer um Größenordnungen geringeren Bandbreite als selbst die langsamste oder am stärksten überlastete CPU.
Der gleichzeitige Zugriff auf eine gemeinsam genutzte Ressource kann kompliziert ( und langsam ) sein
Wenn Sie mehrere Threads haben, die teure Berechnungen durchführen, haben Sie Optionen, wenn Sie nur mehrere Threads verwenden, weil Sie glauben, dass Sie etwas beschleunigen werden, werden Sie einfach das Gegenteil tun. Konkurrenz um E/A verlangsamt immer den Zugriff auf die Ressource, beschleunigt ihn aber nie wegen der Wartezeiten auf Sperren und anderem Overhead.
Sie müssen einen kritischen Abschnitt haben, der geschützt ist und nur einen einzigen Autor gleichzeitig zulässt. Suchen Sie einfach im Quellcode nach einem Protokollierungs-Writer, der Parallelität unterstützt, und Sie werden sehen, dass es nur einen einzigen Thread gibt, der in die Datei schreibt.
Wenn Ihre Anwendung hauptsächlich:
ist-
CPU-gebunden: Sie können einen Sperrmechanismus / ein Datenkonstrukt verwenden, um nur einen von vielen Threads gleichzeitig in die Datei schreiben zu lassen, was aus Sicht der Parallelität als naive Lösung nutzlos ist. Wenn diese Threads CPU-gebunden sind und wenig I/O haben, könnte dies funktionieren.
-
E/A-Grenze: Dies ist der häufigste Fall. Sie müssen ein Messaging-Übergabesystem mit einer Art Warteschlange verwenden und alle Threads in eine Warteschlange/einen Puffer posten und einen einzelnen Thread daraus ziehen und in die Datei schreiben lassen. Dies ist die am besten skalierbare und am einfachsten zu implementierende Lösung.
Journaling – Asynchrone Schreibvorgänge
Wenn Sie eine einzelne sehr große Datei erstellen müssen, bei der die Reihenfolge der Schreibvorgänge unwichtig ist und das Programm CPU-gebunden ist, können Sie eine Journaling-Technik verwenden.
Lassen Sie jeden process
in eine separate Datei schreiben und dann die mehreren Dateien am Ende zu einer einzigen großen Datei zusammenfassen. Das ist ein sehr altes Low-Tech Lösung, die seit Jahrzehnten gut funktioniert.
Je mehr Speicher-E/A Sie haben, desto besser wird dies natürlich am Ende concat.