gnu parallel: пересылать все stdin во все процессы

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

# 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

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

Как сделать Я достиг этого?

2
задан Mr. Wonko
22.04.2023 7:50 Количество просмотров материала 2731
Распечатать страницу

2 ответа

в GNU параллельно было проделано немало работы, чтобы она не начинала новую работу, если нет данных для запуска. Это связано с тем, что некоторые программы терпят неудачу, если они не получают никаких входных данных. Таким образом, вы будете работать против проекта 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
1
отвечен Ole Tange 2023-04-23 15:38

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

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

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

теперь вы начинаете свой материал с:

  ./process_parallel_sh; cat InputFile | parallelise; 
0
отвечен MariusMatutiae 2023-04-23 17:55

Постоянная ссылка на данную страницу: [ Скопировать ссылку | Сгенерировать QR-код ]

Ваш ответ

Опубликуйте как Гость или авторизуйтесь

Имя
Вверх