저는 python2.7 다중 처리 모듈을 좀 더 편안하게 사용하려고합니다. 그래서 필자는 파일 이름과 원하는 수의 프로세스를 입력으로 사용하는 작은 스크립트를 작성한 다음 여러 프로세스를 시작하여 대기열의 각 파일 이름에 함수를 적용합니다. 그것은 다음과 같습니다 : 큐에있는 모든 개체가 사용되는 때까지파이썬 다중 처리 스크립트가 종료되지 않습니다.
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()'을 사용하여 파일 목록을 반복하여 여러 프로세스를 생성했습니다. 그러나 대용량 파일 목록의 경우 최종적으로 프로세스 수가 줄어들 었는데, 그 이유는 파일이 작을 때 일부 프로세스가 작업 목록에서 더 빨리 완료되기 때문입니다. 여기에서는 프로세스가 끝날 때마다 새 파일로 새 프로세스를 시작하고 프로그램 속도를 최적화하기 위해 큐를 사용하려고합니다. –