Как распараллелить вызов функции в Python - PullRequest
0 голосов
/ 18 февраля 2020

У меня есть этот код:

fog_coeff = [0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]
start = time.time()
for f in fog_coeff:

    foggy_images= am.add_fog(images[0:278],fog_coeff=f)

    for img in foggy_images:
        im = Image.fromarray(img)
        im.save('./result/'+str(counter)+'-'+str(fog_coeff)+'.jpg')
        counter += 1
print("time taken"+ str(time.time()-start))

Я хочу это парализовать. Как я могу это сделать? Моя основная идея состояла в том, чтобы взять каждое значение из списка fog_coeff и передать его каждому ядру. Каждое ядро ​​будет обрабатывать 278 изображений. Это правильное направление? Если так, как я могу продолжить?

1 Ответ

0 голосов
/ 18 февраля 2020

У вас есть два варианта: Thread с или Process эс. Первым разрешено совместно использовать память, но они ограничены в том, что они могут делать одновременно, поэтому вы можете, например, использовать переменные для совместного использования результатов, но вам придется использовать блокировки, чтобы избежать гонок fdata.

На другие побочные процессы не позволяют совместно использовать память, получая полный параллелизм на уровне ОС. Вам придется использовать какое-то внешнее соединение, например, сокеты, чтобы отправить выходные данные в основной процесс или записать их результаты в файлы.

Ответ будет зависеть от того, какой из этих двух механизмов вы выберете.

Редактировать: разработка мультиобработки.

Это делается с помощью библиотеки multiprocessing. Вы в основном определите функцию, которую вы хотите, чтобы ваш другой процесс выполнял, а затем запустите ее в другом процессе. Процессы обрабатываются ОС, а не Python, поэтому ваш планировщик ОС будет отвечать за то, где каждый процесс может быть выполнен. Существуют расширенные инструменты, такие как пулы процессов, которые позволят вам всегда иметь 4 запущенных процесса (в случае, если вы работаете с четырехъядерным процессором), но вы не сможете сказать своей ОС, как он должен обрабатывать эти процессы. Он может захотеть выполнять свои собственные фоновые процессы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...