Ich weiß, dass GNU Parallel std / stderr puffert, weil es nicht möchte, dass die parallel do_something ::: task_1 task_2 task_3
Jobausgabe entstellt wird. Wenn ich jedoch meine Jobs mit ausführe, kann die Ausgabe von task_1 sofort angezeigt werden. Nach Abschluss von task_1 ist task_2 auf dem aktuellen Stand Ausgabe usw.
Wenn Parallel dieses Problem nicht lösen kann, gibt es ein ähnliches Programm, das dies könnte?
shell
output
gnu-parallel
Hai Luong Dong
quelle
quelle
--ungroup
auch, wenn Sie sich überhaupt nicht für die Bestellung interessieren.--lb
ist nicht viel langsamer als--ungroup
.parallel
macht eigentlich keine Vorbehalte, die Ausgabe in Ordnung zu bringen. Es kommt einfach so vor, dass Jobs normalerweise klein genug sind und gleichmäßig in der CPU-Zeit aufgeteilt werden, um in der richtigen Reihenfolge herauszukommen. Sie bemerken es mehr, wenn viele Jobs ausgeführt werden oder die Dauer ihrer Aufgaben sehr unterschiedlich ist.Standardmäßig
parallel
werden nur so viele Jobs ausgeführt, wie Ihre CPU über Kerne verfügt. Auf den meisten Laptops und Desktops sind das 2-4, was bedeutet, dass nur ein paar Jobs gleichzeitig ausgeführt werden. Sie können das mit -j erhöhen.Hier ist ein Beispiel, um zu demonstrieren, dass der Auftrag nicht in der Reihenfolge ausgegeben wird, in der er gesendet wurde.
Ausgabe auf meinem System war (Ihre wird wahrscheinlich anders sein)
seq 20
ist ein Befehl, der die Nummern 1-20 ausgibt. Ich leite das parallel und sage dann, dass 20 Jobs gleichzeitig ausgeführt werden sollen, um sicherzustellen, dass alle gleichzeitig gestartet werden.'sleep $[\[RANDOM][1] % 20];
verwendet sleep plus einen zsh-Parameter, der eine Zufallszahl zwischen 1 und 20 zurückgibt. Jeder Job schläft diese zufällige Menge und dannecho
. Sobald der Job wiedergegeben wird, erhalten Sie sofort die Ausgabe von parallel.Sie könnten auch etwas ähnliches mit tun ,
parallel --shuf
was wird den Job , um mischen .quelle
-k/--keep-order
(ich habeparallel
Version 20141022 verwendet)seq 20 | parallel -k -j2000% 'sleep $[RANDOM % 20]; echo ' 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20