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


person amg    schedule 14.02.2015    source источник


Ответы (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 в интерпретаторе, но в остальном это то же самое.

person Mike McKerns    schedule 14.02.2015

Вы также можете использовать библиотеку pp. Я предпочитаю pp многопроцессорной обработке, потому что она позволяет выполнять параллельную обработку на разных процессорах в сети. Функцию (func) можно применить к списку входных данных (args) с помощью простого кода:

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

person gopi    schedule 26.11.2015