У меня есть Linux-машина с 4 процессорами.Многопроцессорный Python
У меня есть длинная программа, которую мне нужно выполнить одновременно на 1024 хостах и вернуть результат.
ipArrayList -> Contains list of host ips.
Ниже программа работает нормально, но это занимает много времени, а иногда он висит в течение нескольких дней:
import multiprocessing
pool = multiprocessing.Pool(100)
pool.map(long_running_module,ipArrayList)
pool.close()
pool.join()
Ниже программа работает быстрее только в случае меньшего ввода (размер ipArrayList). Если количество IP-адреса в списке ipArray огромно, то иногда я бег в проблемы буферного пространства. ([Errno 105] Нет буфер свободного места)
job = []
for ip in ipArrayList:
p = multiprocessing.Process(target=long_running_module, args=(ip))
job.append(p)
p.start()
for j in job:
j.join()
long_run_module подключается к каждому из IP в ipArrayList через SSH (paramiko). Он выполняет некоторые длительные вычисления внутри хост-машины, а затем возвращает результат в синхронизированный список.
Просьба помочь мне эффективно запрограммировать это.
Я подозреваю, что когда вы переполняете буфер аргументов, хотя я не уверен. Вместо этого попробуйте отправить список: 'multiprocessing.Process (target = long_running_module, args = (ipArray,))'. Обязательно ожидайте список в вашей обработке. –
Почему пул из 100 на 4 процессора? –
Рекомендация: используйте https://www.gnu.org/software/parallel/ –