A partir da versão 20160422, você pode fazer:
parallel -k --lb do_something ::: task_1 task_2 task_3
Eu sei que os buffers GNU Parallel std / stderr porque ele não quer que a saída de jobs seja desconfigurada, mas se eu executar meus jobs com parallel do_something ::: task_1 task_2 task_3
, existe de qualquer maneira a saída da task_1 ser exibida imediatamente, depois que a task_1 terminar , task_2 até sua saída atual, etc.
Se o Parallel não puder resolver este problema, existe algum outro programa semelhante que possa?
parallel
na verdade não faz reservas quanto a tornar a produção em ordem. Acontece que os trabalhos são tipicamente pequenos o suficiente e divididos uniformemente no tempo da CPU para sair em ordem. Você percebe mais quando tem muitos trabalhos em execução ou a duração da tarefa é muito diferente.
Por padrão, parallel
só executará a mesma quantidade de trabalhos que sua CPU possui núcleos. Na maioria dos laptops e desktops é 2-4, o que significa que está executando apenas alguns trabalhos de cada vez. Você pode aumentar isso com -j.
Veja um exemplo para demonstrar que a ordem de trabalho não é exibida na ordem em que foi enviada.
seq 20 | parallel -j 20 'sleep $[RANDOM % 20]; echo '
a saída no meu sistema foi (a sua provavelmente será diferente)
7
3
13
20
8
16
2
4
18
17
1
5
9
14
12
6
10
19
11
15
seq 20
é um comando que produzirá números de 1 a 20. Eu canalizo isso para paralelo e, em seguida, digo para ele executar 20 trabalhos simultâneos para garantir que todos eles iniciem ao mesmo tempo. 'sleep $[\[RANDOM][1] % 20];
está usando sleep mais um parâmetro zsh que retornará um número aleatório entre 1 e 20. Cada trabalho irá dormir esse valor aleatório e, em seguida, echo
. Uma vez que o trabalho echo você vai imediatamente obter a saída de paralelo.
Você também pode fazer algo semelhante com parallel --shuf
, o que embaralha a ordem de trabalho .
Tags output shell gnu-parallel