Как реализовать одну программу несколько данных (SPMD) в Python
Я прочитал документацию по многопроцессорности. в Python и обнаружил, что задача может быть назначена на разные ядра процессора. Мне нравится запускать следующий код (как начало) параллельно.
from multiprocessing import Process
import os
def do(a):
for i in range(a):
print i
if __name__ == "__main__":
proc1 = Process(target=do, args=(3,))
proc2 = Process(target=do, args=(6,))
proc1.start()
proc2.start()
теперь я получаю вывод как 1 2 3, а затем 1 ....6. но мне нужно работать как 1 1 2 2, т.е. я хочу запустить proc1 и proc2 параллельно (не один за другим).
2 ответа
Таким образом, вы можете выполнить ваш код параллельно, просто используя map
, Я использую задержку (с time.sleep
) замедлить код, чтобы он печатался так, как вы хотите. Если вы не используете сон, первый процесс завершится до начала второго... и вы получите 0 1 2 0 1 2 3 4 5
,
>>> from pathos.multiprocessing import ProcessingPool as Pool
>>> p = Pool()
>>>
>>> def do(a):
... for i in range(a):
... import time
... time.sleep(1)
... print i
...
>>> _ = p.map(do, [3,6])
0
0
1
1
2
2
3
4
5
>>>
Я использую multiprocessing
вилка pathos.multiprocessing
потому что я автор, и мне лень кодировать его в файл. pathos
позволяет вам сделать multiprocessing
в переводчике, но в остальном это в основном то же самое.
Вы также можете использовать библиотеку pp. Я предпочитаю pp, а не многопроцессорную, потому что она позволяет выполнять параллельную обработку для разных процессоров в сети. Функция (func) может быть применена к списку входных данных (аргументов) с помощью простого кода:
job_server=pp.Server(ncpus=num_local_procs,ppservers=nodes)
result=[job() for job in job_server.submit(func,input) for arg in args]
Вы также можете ознакомиться с другими примерами по адресу: https://github.com/gopiks/mappy/blob/master/map.py