Я пытаюсь получить немного больше комфорта с модулем многопроцессорности python2.7. Поэтому я написал небольшой скрипт, который принимает имена файлов и необходимое количество процессов в качестве входных данных, а затем запускает несколько процессов для применения функции к каждому имени файла в моей очереди. Это выглядит следующим образом:сценарий многопроцессорности python не выходит
import multiprocessing, argparse, sys
from argparse import RawTextHelpFormatter
def parse_arguments():
descr='%r\n\nTest different functions of multiprocessing module\n%r' % ('_'*80, '_'*80)
parser=argparse.ArgumentParser(description=descr.replace("'", ""), formatter_class=RawTextHelpFormatter)
parser.add_argument('-f', '--files', help='list of filenames', required=True, nargs='+')
parser.add_argument('-p', '--processes', help='number of processes for script', default=1, type=int)
args=parser.parse_args()
return args
def print_names(name):
print name
###MAIN###
if __name__=='__main__':
args=parse_arguments()
q=multiprocessing.Queue()
procs=args.processes
proc_num=0
for name in args.files:
q.put(name)
while q.qsize()!=0:
for x in xrange(procs):
proc_num+=1
file_name=q.get()
print 'Starting process %d' % proc_num
p=multiprocessing.Process(target=print_names, args=(file_name,))
p.start()
p.join()
print 'Process %d finished' % proc_num
скрипта отлично работает и запускает новый процесс каждый раз, когда старый процесс отделки (я думаю, что это, как это работает?), Пока все объекты в очереди не израсходованы. Тем не менее, сценарий не выходит после завершения очереди, но сидит без дела, и я должен убить его, используя Ctrl+C
. В чем проблема?
Спасибо за ваши ответы!
Почему вы используете очереди? Он не делится между дочерними процессами, вы также можете перебирать через 'args.files'. – cdarke
Раньше я повторял список файлов, используя «multiprocessing.Pool()», чтобы вызвать множество процессов. Тем не менее, для больших списков файлов число процессов в конце концов сокращалось, так как (как мне кажется, происходит) некоторые процессы быстрее заканчиваются с их списком задач, когда файлы меньше. Здесь я пытаюсь использовать очередь для запуска нового процесса с новым файлом каждый раз, когда процесс заканчивается, чтобы оптимизировать скорость моей программы. –