2015-04-18 5 views
1

Мое требование - запустить функцию оболочки или скрипт параллельно с многопроцессорной обработкой. В настоящее время я делаю это с помощью приведенного ниже сценария, который не использует многопроцессорную обработку. Также, когда я запускаю 10 заданий параллельно, одно задание может быть завершено досрочно и должно дождаться завершения остальных 9 заданий. Я хотел устранить это с помощью многопроцессорности в python.
Множественная обработка сценария оболочки в python

i=1 
total=`cat details.txt |wc -l` 
while [ $i -le $total ] 
do 
name=`cat details.txt | head -$i | tail -1 | awk '{print $1}' 
age=`cat details.txt | head -$i | tail -1 | awk '{print $2}' 
./new.sh $name $age & 
    if (($i % 10 == 0)); then wait; fi 
done 
wait 

Я хочу запустить ./new.sh $name $age внутри питона сценария с многопроцессорной поддержкой (принимая во внимание количество центрального процессора) Как вы можете видеть, значение $ имени и $ возраста приведет к изменению в каждом исполнении. Пожалуйста, поделитесь своими мыслями

+1

Ваш код уже использует многопроцессорность: каждый вызов './New.sh' запускается в отдельном процессе и будет запланирован ОС. –

+0

@MichaelJaros. Хорошо, но мое требование - также начать работу, когда закончится одно из первых 10 заданий. –

ответ

1

Во-первых, весь сценарий Schell может быть заменен:

awk '{ print $1; print $2; }' details.txt | xargs -d'\n' -n 2 -P 10 ./new.sh 

Простое решение pyhton будет:

from subprocess import check_call 
from multiprocessing.dummy import Pool 

def call_script(args): 
    name, age = args # unpack arguments 
    check_call(["./new.sh", name, age]) 

def main(): 
    with open('details.txt') as inputfile: 
     args = [line.split()[:2] for line in inputfile] 
    pool = Pool(10) 
    # pool = Pool() would use the number of available processors instead 
    pool.map(call_script, args) 
    pool.close() 
    pool.join() 

if __name__ == '__main__': 
    main() 

Обратите внимание, что это использует multiprocessing.dummy.Pool (пул потоков) для вызова внешнего скрипта, который в этом случае предпочтительнее пула процессов, поскольку весь метод call_script выполняет вызов сценария и ожидает его возврата. Выполнение этого в рабочем процессе вместо рабочего потока не будет увеличивать производительность, поскольку это операция на основе ввода-вывода. Это только увеличило бы накладные расходы для создания процесса и межпроцессного общения.

+0

. Сценарий оболочки, который вы предложили, работал, и я тоже хотел попробовать код python. Я получаю эту ошибку «AttributeError: объект« ThreadPool »не имеет атрибута« starmap »« Моя версия python равна 2.6 –

+0

Вы правы, 'starmap' был введен в python3.3 - вместо этого вместо примера использовался символ« map » – mata

+0

Большое спасибо @mata. Как вы сказали, скрипт оболочки, который вы использовали, лучше работает. –

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