2017-02-04 48 views
1

我一直在嘗試構建一個簡單的多處理程序,它可以在特定時間內捕獲X的值,並跳過不在讀取時間的值。 這是代碼:Python在多處理中讀取多個值

from multiprocessing import Process, Pipe 
from time import sleep 

def f(conn): 
    x=0 
    for i in xrange(0,20): 
     x+=1 
     sleep(0.1) 
     conn.send(x) 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    for i in xrange(0,5): 
     print parent_conn.recv() 
     sleep(0.4) 
    p.join() 

粗略地說,就是我從上面的代碼想到的是這樣的:

>>> 
4 
8 
16 
20 

而是空閒給了我這樣的輸出:

>>> 
1 
2 
3 
4 
5 

直到它達到20爲止。 有沒有任何命令來清除緩衝區?或類似的東西?

謝謝你提前。

回答

1

問題是recv()獲取管道中的下一個值,而不是最後一個值。接連4

2, 3, 4 

於是,經過4次迭代,fsend 4個項目進入pipe,所以管看起來是這樣的:

1, 2, 3, 4 

和主要過程將recv1迭代send

2, 3, 4, 5, 6, 7, 8 

和主要過程recv es 2。爲了只接收最後一個,你需要先清空管道:

from multiprocessing import Process, Pipe 
from time import sleep 

def f(conn): 
    x=0 
    for i in xrange(0,20): 
     x+=1 
     sleep(0.1) 
     conn.send(x) 
    conn.close() 

if __name__ == '__main__': 
    parent_conn, child_conn = Pipe() 
    p = Process(target=f, args=(child_conn,)) 
    p.start() 
    for i in xrange(0,5): 
     sleep(0.4) 
     # `recv` all values, keep only the last one 
     last = None 
     while parent_conn.poll(): 
      last = parent_conn.recv() 
     print(last) 
    p.join() 
+0

因此,我應該使用poll()來清除管道。但這怎麼可能?當poll()變成False時?我的意思是它應該是在20年底的權利?或者我在這裏錯過了什麼?它的工作很明顯,但我只是很困惑如何工作。謝謝 – aji

+0

@aji'poll'檢查管道中是否還有可以接收的元素,所以你可以把它理解爲'has_elements'。如果'poll'變爲false,則停止while循環。清空管道是通過重複「recv」來完成的。 – hansaplast