Почему Python не выполняет параллельные вычисления при запуске pipe ()? - PullRequest
0 голосов
/ 30 марта 2019

Когда я использую многопроцессорность для запуска двух функций, я могу получить результат, что они выполняются параллельно. Но теперь я хочу, чтобы два подпроцесса связывались друг с другом, поэтому я ввел метод Pipe (), после чего я обнаружил, что эти две функции не выполняются параллельно

(проект, который я прикрепил, стоит 2 с, а не 1 с ... если я удалю все методы pipe (), он будет стоить только 1 с, что означает, что две функции работают параллельно).

Интересно, что не так с моим кодом ... что-то не так, когда я использую join () или recv () ??

Одним словом, я хочу знать, как заставить две функции работать параллельно, когда я использую Pipe () для связи между ними? Большое спасибо!

import numpy as np
import multiprocessing
import time 

def funca(mylist,conn):
        time.sleep(1)         
        mylist.append(666.6)
        conn.send(['a','a','a'])

def funcb(mylist,conn):
        time.sleep(1)
        mylist.append(66.6)
        conn.send(['b','b','b'])

if __name__ == "__main__":
    samples = [1,2,3]
    with multiprocessing.Manager() as MG: 
        conn1,conn2 = multiprocessing.Pipe()
        mylist = MG.list(samples)  
        tic = time.time()
        p1=multiprocessing.Process(target=funca,args=(mylist,conn1) ) 
        p1.start()
        print(conn2.recv())
        funcb(mylist,conn1)
#        p2=multiprocessing.Process(target=funcb,args=(mylist,conn1) ) 
#        p2.start()
        print(conn2.recv())
        p1.join()
#        p2.join()
        p1.terminate()
#        p2.terminate()
        print(list(mylist))
    toc = time.time()
    print('pass time = ',toc-tic)

1 Ответ

1 голос
/ 30 марта 2019

Проблема в том, что вы получаете из канала print(conn2.recv()) перед запуском второго процесса.Это приводит к тому, что второй процесс откладывается до завершения первого.

Это также происходит, когда второй процесс запускается в основном процессе, как это происходит в вашем примере, путая его с закомментированными строками.Изменить:

print(conn2.recv())
funcb(mylist,conn1)

На:

funcb(mylist,conn1)
print(conn2.recv())
...