GNU Parallel: Job stderr / stdout sofort einzeln nach Auftragsreihenfolge anzeigen

8

Ich weiß, dass GNU Parallel std / stderr puffert, weil es nicht möchte, dass die parallel do_something ::: task_1 task_2 task_3Jobausgabe 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?

Hai Luong Dong
quelle

Antworten:

12

Ab Version 20160422 können Sie Folgendes tun:

parallel -k --lb do_something ::: task_1 task_2 task_3
Ole Tange
quelle
Ich habe es gerade installiert und es funktioniert genau so, wie ich es wollte. Vielen Dank!
Hai Luong Dong
Es gibt --ungroupauch, wenn Sie sich überhaupt nicht für die Bestellung interessieren.
Zyxue
Ab Version 20170822 --lbist nicht viel langsamer als --ungroup.
Ole Tange
2

parallelmacht 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 parallelwerden 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.

seq 20 | parallel -j 20 'sleep $[RANDOM % 20]; echo '

Ausgabe auf meinem System war (Ihre wird wahrscheinlich anders sein)

7
3
13
20
8
16
2
4
18
17
1
5
9
14
12
6
10
19
11
15

seq 20ist 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 dann echo. Sobald der Job wiedergegeben wird, erhalten Sie sofort die Ausgabe von parallel.

Sie könnten auch etwas ähnliches mit tun , parallel --shufwas wird den Job , um mischen .

Rothgar
quelle
1
Eigentlich kann es mit -k/--keep-order(ich habe parallelVersion 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
Hai Luong Dong