Как реализовать одну программу несколько данных (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

Другие вопросы по тегам