1

У меня есть 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). Он выполняет некоторые длительные вычисления внутри хост-машины, а затем возвращает результат в синхронизированный список.

Просьба помочь мне эффективно запрограммировать это.

+0

Я подозреваю, что когда вы переполняете буфер аргументов, хотя я не уверен. Вместо этого попробуйте отправить список: 'multiprocessing.Process (target = long_running_module, args = (ipArray,))'. Обязательно ожидайте список в вашей обработке. –

+2

Почему пул из 100 на 4 процессора? –

+0

Рекомендация: используйте https://www.gnu.org/software/parallel/ –

ответ

1

Я согласен, что использование пула не является лучшим, если у вас всего 4 ядра, вы можете вместо этого использовать функцию «map», посмотрите на this.

map(f, S) 

еэто функция, которая принимает один аргумент и возвращает значение.

S- любой итерационный.

>>> def add100(x): 
...  return x+100 
... 
>>> map(add100, (44,22,66)) 
[144, 122, 166] 

Однако, как вам нужно выполнить одновременно на 1024 хостов и получить результат назад, я настоятельно рекомендую вам использовать распределенную платформу. Есть некоторые из них в Python, но SCOOP очень хорошо документирован и поддерживается.

+0

Спасибо за предложение. – May

+0

Добро пожаловать. – epinal

Смежные вопросы