2017-01-23 18 views
0

我有兩個過程:proc_a,proc_b我想proc_a回報的是等於data_new值。 這是可能的還是我必須使用多個管道?Python的 - 使用相同的雙工管道()多進程

if __name__ == '__main__': 

    parent, child = Pipe() 
    p1 = Process(target=proc_a, args=(parent, child,)) 
    p2 = Process(target=proc_b, args=(parent, child,)) 

    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

而且在proc_a()proc_b()

def proc_a(parent, child): 
     data = somedata 
     child.send(data) 
     result = parent.recv() 

     return result 


def proc_b(parent, child): 
    data = parent.recv() 
    data_new = data + 1 # Sample change 
    child.send(data_new) 

回答

0

你可以只用一個管道解決這個問題,因爲管道是雙向(全雙工)。 但你不能做的是將管道的兩端發送到兩個進程。

見本section of the docs

。注意,在一個管道中的數據可能會損壞如果兩個進程(或線程)嘗試從讀取或寫入到所述管道的同時同一端。當然,不會同時使用管道的不同端點進行腐蝕的風險。

此代碼的工作,並打印2

from multiprocessing import Pipe, Process 

def proc_a(pipe): 
    data = 1 
    pipe.send(data) 
    result = pipe.recv() 
    print(result) 

def proc_b(pipe): 
    data = pipe.recv() 
    data_new = data + 1 # Sample change 
    pipe.send(data_new) 

if __name__ == '__main__': 
    parent, child = Pipe() 
    p1 = Process(target=proc_a, args=(parent,)) 
    p2 = Process(target=proc_b, args=(child,)) 

    p1.start() 
    p2.start() 
    p1.join() 
    p2.join() 

注意的proc_areturn什麼都不做,如果你需要消耗的父進程的返回值看看this question