Многопроцессорная обработка Python - выделить новую функцию для готового процесса?
У меня есть список из 800 файлов изображений, которые я хотел бы обрабатывать параллельно. Предположим, я храню их имена в списке как таковой:
lis_fnames = ['im1.jpg','im2.jpg',...']
Затем я импортирую многопроцессорный модуль и из этого я импортирую Пул. Я даю каждому потоку функцию run_cli, которая принимает имя файла.
На данный момент я запускаю следующий код:
def run_pool():
pool = Pool(processes=4)
pool.map(run_cli, ['im1.jpg','im2.jpg','im3.jpg','im4.jpg'])
И вручную измените имена файлов после завершения итерации. Мой вопрос:
Q) Учитывая четыре процесса, если один процесс завершен, как я могу автоматически снабдить его функцией 'run_cli' и другим именем файла (из списка lis_fnames) для его анализа, не дожидаясь завершения всех четырех процессов, а потом вручную запустить его снова?
1 ответ
Вы должны оставить это в бассейн. Нет необходимости вручную разбивать итерацию на подходящие куски. Просто нанесите на карту все это, и Pool будет продолжать кормить ваших работников больше работы, пока в вашем списке остаются предметы.
Это простой, но рабочий пример. Также показаны два возможных способа обработки результатов. Он выполняет обратный вызов и анализирует объект результата. Конечно, вы будете делать только один из них - или ничего, если вы не заботитесь о возвращаемых ценностях от ваших работников.
import multiprocessing
from time import sleep
import random
def completed(x):
print("Done {}".format(x))
def worker(x):
sleep(x)
print("Worker completed {}".format(x))
return(x)
p = multiprocessing.Pool(processes=4)
tasks = [random.randint(0,5) for _ in range(0,20)]
results = p.map_async(worker, tasks, callback=completed)
p.close()
p.join()
for r in results.get():
print(r)
Это создает список "задач", в данном случае просто список случайных чисел. Работник эмулирует работу, считая количество секунд, переданных в качестве параметра. Вы можете видеть, как рабочие завершены, и, наконец, когда все рабочие закончили, вы получите "результат".
Всегда активны четыре параллельных работника, но список задач выходит за рамки этого. Бассейн может позаботиться об этом.