Параллельно GNU: перенаправить все stdin всем процессам

558
Mr. Wonko

Я пытаюсь обрабатывать ввод разными способами параллельно, записывая получающиеся строки по мере их поступления. Мой текущий подход заключается в следующем:

# process_parallel.sh read input parallel --colsep ' ' --linebuffer 'echo $input | {}' \ ::: 'python process1.py' ./process2.sh ./process3 

Контекст сводится к чему-то вроде этого:

(sleep 1; echo "short input arriving late") | ./process_parallel.sh | ./collate_results.sh 

Вышеописанное работает, но имеет один важный недостаток: процессы не запускаются, пока ввод не будет прочитан. Я хочу запустить их немедленно, так как это может занять некоторое время, а затем подключить параллельный канал к каждому из них.

Как мне этого добиться?

2

2 ответа на вопрос

1
Ole Tange

В GNU Parallel была проделана небольшая работа, чтобы не запускать новое задание, если нет данных для запуска. Это связано с тем, что некоторые программы терпят неудачу, если они не получают никакого ввода. Таким образом, вы будете работать против дизайна GNU Parallel.

Для дублирования ввода вы можете использовать teeи обработать замену:

cat namedpipe_or_file | tee >(process1) >(process2) >(process3) >/dev/null 

Она начнется process1, process2и process3немедленно. Вывод может, однако, быть смешанным, поэтому, если вывод должен использоваться, вы должны перенаправить его в другие файлы:

cat namedpipe_or_file | tee >(process1 > out1) >(process2 > out2) >(process3 > out3) >/dev/null 
0
MariusMatutiae

Имейте два скрипта-обертки: во-первых, измените process_parallel.sh так, чтобы каждый из процессов получил инструкцию прочитать свой ввод из трех файлов, например, file1, file2, file3.

Теперь напишите второй скрипт-обертку, который параллельно отправляет свой стандартный ввод в три файла, что-то вроде:

 #!/bins/bash #parallelise input # let's call this file parallelise parallel -j 3 -- "echo $1 > file1" "echo $1 > file2" "echo $1 file3" 

Теперь вы начинаете свои вещи с:

 ./process_parallel_sh; cat InputFile | parallelise; 
Это приемлемо, хотя я бы использовал именованные каналы вместо реальных файлов. Но я надеялся на более простой способ ... Я полагаю, параллель просто не совсем то, что мне нужно. Mr. Wonko 9 лет назад 0