Как я могу поставить в очередь несколько заданий, но ограничить их запуском 5 за раз, используя Bash

У меня есть текстовый файл со списком заданий для обработки. Он мог бы обработать их все сразу, но это перегружает ресурсы компьютера и некоторые задания не выполняются. Он также может обрабатывать по одной строке за раз, но общее время обработки слишком велико.

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

Каждое задание находится в одной строке текстового файла. Есть ли способ загрузить список заданий для запуска, но ограничить его выполнением 5 за раз?


person Emile    schedule 03.11.2017    source источник


Ответы (2)


это должно выполняться так, как вы ищете. Я не проверял это, хотя. Это будет работать только на BASH.

IFS=$'\n' read -d '' -r -a jobs < list_of_jobs.txt
total_number_of_jobs=$( wc -l list_of_jobs.txt | awk '{print $1}' )
i=0;
accumulated=0;
limit=5; #How many to process at the same time
while [ $i -lt $total_number_of_jobs ]
do
    while [ $accumulated -lt $limit ] && [ $i -lt $total_number_oj_jobs ]
    do
        ./${jobs[$i]} &
        (( i ++ ))
        (( accumulated ++ ))
    done
    wait
    accumulated=0

done

Дайте мне знать, если это поможет вам. С Уважением!

person Matias Barrios    schedule 03.11.2017
comment
wc -l <list_of_jobs.txt сохранит имя файла вне списка без необходимости использования awk. Тем не менее, большая проблема с этим кодом заключается в том, что wait не гарантирует, что он ожидает только одно задание. Таким образом, вы запускаете пять заданий, ждете завершения всех пяти, затем запускаете еще пять — таким образом, каждый пакет из пяти ограничивается самым медленным из пяти; с момента, когда самый быстрый из пяти выходит, до момента, когда самый медленный из пяти, вы теряете/неиспользуете ресурсы. - person Charles Duffy; 03.11.2017
comment
Сравните это с тем, что будет делать xargs -P "$limit", когда вы всегда выполняете пять заданий одновременно, запуская другое, как только одно завершается. - person Charles Duffy; 03.11.2017
comment
В первой строке что означает работа? Я понимаю, что list_of_jobs.txt — это входной файл, но я не понимаю работу. Кроме того, я сейчас изучаю xargs... - person Emile; 03.11.2017
comment
Чарльз, поставить "$5" вместо "$limit"? - person Emile; 03.11.2017
comment
@CharlesDuffy Я понял ваши точки зрения, они все вполне верны. Я не знал о -P для xargs. отлично. - person Matias Barrios; 06.11.2017
comment
@ Эмиль, этот код предполагал limit=5; если вы хотите жестко запрограммировать его, просто xargs -P 5. - person Charles Duffy; 06.11.2017

Я бы рекомендовал GNU Parallel следующим образом:

parallel -j 5 -a YourJobFile

Вариантов много, попробуйте добавить —-eta или —-progress

person Mark Setchell    schedule 03.11.2017