Gnu Parallel: параллельная перезагрузка программы для каждой работы? - PullRequest
1 голос
/ 17 апреля 2019

Предположим, у меня есть программа, которая загружает значительный контент перед запуском ... но это одноразовое замедление.

Далее я пишу:

cat ... | parallel -j 8 --spreadstdin --block $sz ... ./mycode

Будет ли это накладывать нагрузку на каждую отдельную работу?

Если это вызывает накладные расходы, есть ли способ избежать этого?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Как говорит @Barmar, ./mycode запускается для каждого блока в вашем примере.

Но так как вы не используете -k в своем примере, вы можете использовать --round-robin.

... | parallel -j 8 --spreadstdin --round-robin --block $sz ... ./mycode

Это запустится 8 ./mycode с (но не по одному на блок) и даст блоки любому процессу, который готов к чтению.

Этот пример показывает, что процессу дается больше блоков11 и 10, чем процессы 4 и 5, потому что 4 и 5 читают медленнее:

seq 1000000 |
  parallel -j8 --tag --roundrobin --pipe --block 1k 'pv -qL {}0000 | wc' ::: 11 4 5 6 9 8 7 10
1 голос
/ 17 апреля 2019

parallel ничего не знает о внутренней работе программы, с которой вы работаете.Каждый экземпляр работает независимо, невозможно, чтобы инициализация одного вызова могла быть скопирована в другие.

Если вы хотите, чтобы приложение инициализировалось один раз, а затем запускали несколько экземпляров параллельно, вам нужно спроектировать это в приложение.сам.Он должен загрузить данные, а затем использовать fork() для создания нескольких процессов, использующих эти данные.

...