GNU Parallel как очередь заданий с именованными каналами - PullRequest
0 голосов
/ 23 октября 2018

Я использовал образец кода , чтобы создать параллельную очередь заданий GNU, как показано ниже

// create a job queue file
touch jobqueue

//start the job queue
tail -f jobqueue | parallel -u php worker.php 

// in another shell, add the data 
while read LINE; do echo $LINE >> jobqueue; done < input_data_file.txt 

Этот подход работает и обрабатывает задание как простую очередь заданий.Но есть две проблемы:

1 - чтение данных из входного файла, а затем запись его в очередь заданий (другой файл) выполняется медленно, так как требует дискового ввода-вывода.

2 - если по какой-то причине моя работа прерывается в середине, и я перезапускаю параллельную обработку, она перезапустит все задания в файле очереди заданий

Я могу добавить скрипт вworker.php для фактического удаления строки из очереди заданий, когда работа выполнена, но я чувствую, что есть лучший способ сделать это.

Возможно ли, что вместо

tail -f jobqueue

IМожно использовать именованный канал в качестве входных данных для параллельной, и моя текущая настройка все еще может работать как простая очередь?

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

PS Я знаю, и я использовал RabbitMQ, ZeroMQ (и мне это нравится), nng, nanomsg и даже php pcntl_fork, а также pthreads.Так что вопрос не в том, что там для параллельной обработки.Больше о том, чтобы создать рабочую очередь с gnu параллельно.

1 Ответ

0 голосов
/ 23 октября 2018
while read LINE; do echo $LINE >> jobqueue; done < input_data_file.txt 

Это можно сделать намного быстрее:

cat >> jobqueue < input_data_file.txt 

Хотя fifo может работать, он заблокируется.Это означает, что вы не можете поместить много в очередь - что в некоторой степени противоречит назначению очереди.

Я удивлен, если дисковый ввод-вывод является проблемой для чтения реальных заданий: GNU Parallel может работать 100-1000 рабочих мест в секунду.Задание может занимать не более 128 КБ, поэтому самое большее на вашем диске должно быть 128 МБ / с.Если вы не выполняете 100 заданий в секунду, то дисковый ввод-вывод очереди никогда не будет проблемой.

Вы можете использовать --resume --joblog mylog, чтобы пропустить уже запущенные задания, если перезапустите:

# Initialize queue
true >jobqueue
# (Re)start running the queue 
tail -n+0 -f jobqueue | parallel --resume --joblog mylog
...