Im Allgemeinen gibt es Probleme, die es sehr schwierig machen, garantieren dies wird nicht passieren, ohne sich in Multi-Prozess-Locking zu vertiefen. Sie können jedoch das Problem normalerweise sehr reduzieren.
Die häufigste Ursache hierfür ist die I / O-Pufferung in Python oder libc. Zum Beispiel kann es 16k Ausgabe puffern und dann den gesamten Block auf einmal schreiben. Sie können das reduzieren, indem Sie nach dem Schreiben stdout spülen, aber das ist peinlich. Theoretisch sollten Sie in der Lage sein, -u
an Python zu übergeben, um das Stout-Puffering zu deaktivieren, aber das hat nicht funktioniert, als ich es ausprobiert habe. Siehe Sebastjans Antwort auf Ausgabepufferung deaktivieren für eine allgemeinere Lösung (obwohl es wahrscheinlich eine Möglichkeit gibt, die Pufferung der Ausgabe direkter zu deaktivieren). p>
Ein zweites Problem ist, dass die zugrunde liegenden Schreibvorgänge nicht immer atomar sind. Insbesondere sind Schreibvorgänge in Pipes nur bis zu einer bestimmten Größe atomar (PIPE_BUF, normalerweise 512 Bytes); darüber hinaus ist es nicht garantiert. Das gilt nur für Pipes (nicht für Dateien), aber es gelten die gleichen allgemeinen Probleme: kleinere Schreibvorgänge treten eher atomar auf. Siehe Ссылка .
Die komplizierte und technisch korrekte Lösung wäre, einen Mutex zum Schreiben zu implementieren, aber das ist meiner Meinung nach suboptimal.
Und es macht sowieso keinen Spaß. Wie wäre es, die Ausgabe von xargs zu pipen (auf diese Weise erhalten Sie solide Teile der Ausgabe, anstatt einen Strom von Ausgaben, die aufgebrochen werden) und dann kombinieren Sie diese Stücke irgendwie?
Das Problem ist, dass die Ausgabe von xargs zusammengemischt wird. GNU Parallel wurde entwickelt, um dieses Problem zu lösen. Standardmäßig garantiert es, dass die Ausgabe nicht gemischt wird. Sie können das einfach tun:
%Vor%Damit wird ein logger.py pro CPU ausgeführt. Wenn du 10 willst:
%Vor%Sehen Sie sich das Introvideo an, um mehr über GNU Parallel Ссылка
zu erfahren