0

, глядя на как распараллелить задачи Баша, Я спотыкаюсь кода, как это:Как работает ограничение работы фона?

for item in "${items[@]}" 
do 
    ((i=i%THREADS)); ((i++==0)) && wait 
    process_item $item & 
done 

Где process_item некоторый король функции/программа, которая работает с пунктом и THREADS вара содержит максимальное количество фоновые процессы, которые могут выполняться одновременно.

Может кто-нибудь объяснить мне, как это работает? Я понимаю, что i=i%THREADS гарантирует, что i находится между 0 и THREADS-1 и что i++==0 приращений i и проверяет, является ли оно 0. Но есть wait, связанный со всеми подпроцессами? Или как он знает, что нужно ждать, пока предыдущая партия перестанет обрабатывать?

ответ

0

i++==0 проверяет и увеличивает, а не наоборот. wait ждет всех активных дочерних процессов. Итак, каждая итерация (но первая, благодаря ((i++==0))) сначала ждет процесса, запускаемого предыдущей итерацией, и запускает новый процесс.

0

Это нечитаемом способ написания

for item in "${items[@]}" 
do 
    # Every THREADSth job, stop and wait for everything 
    # to complete. 
    if ((i % THREADS == 0)); then 
     wait 
    fi 
    ((i++)) 
    process_item $item & 
done 

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

Смежные вопросы