Я понимаю, что могу использовать класс пула и, вероятно, получить то, что мне нужно, но я хочу немного более тонкого контроля над моей проблемой. У меня больше рабочих мест, чем у процессоров, поэтому я не хочу, чтобы они запускали все за один раз.Python - Многопроцессорность - больше заданий, которые выполняются cpus.
Например:
from multiprocessing import Process,cpu_count
for dir_name in directories:
src_dir = os.path.join(top_level,dir_name)
dst_dir = src_dir.replace(args.src_dir,args.target_dir)
p = Process(target=transfer_directory, args=(src_dir, dst_dir,))
p.start()
Однако, если у меня есть более чем 16 каталогов, я тогда начнет больше рабочих мест, чем у меня есть процессоры. Вот мое решение, которое действительно взломало.
from multiprocessing import Process,cpu_count
jobs = []
for dir_name in directories:
src_dir = os.path.join(top_level,dir_name)
dst_dir = src_dir.replace(args.src_dir,args.target_dir)
p = Process(target=transfer_directory, args=(src_dir, dst_dir,))
jobs.append(p)
alive_jobs = []
while jobs:
if len(alive_jobs) >= cpu_count():
time.sleep(5)
print alive_jobs
for aj in alive_jobs:
if aj.is_alive():
continue
else:
print "job {} removed".format(aj)
alive_jobs.remove(aj)
continue
for job in jobs:
if job.is_alive():
continue
job.start()
alive_jobs.append(job)
print alive_jobs
jobs.remove(job)
if len(alive_jobs) >= cpu_count():
break
Есть ли лучшее решение с использованием встроенных инструментов?
Какое качество контроля вам дает? –
Хорошо, если у кого-то есть решение, позволяющее клавиатуре прерывать модуль пула без его замораживания и закрывать терминал – jwillis0720
Связанный: [Прерывания клавиатуры с многопроцессорным пулом python] (http://stackoverflow.com/questions/1408356/ клавиатура-перебивает-с-питоны-многопроцессорной-пул). –