2017-02-04 1 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() 

, 내가 위의 코드에서 기대하고있어 이것이다 : 이 코드입니다

>>> 
1 
2 
3 
4 
5 

:

>>> 
4 
8 
16 
20 

하지만 대신 IDLE 나에게이 출력을 준 그리고 20 시까 지 계속됩니다. 버퍼 지우기 명령이 있습니까? 또는 비슷한 것?

미리 감사드립니다.

답변

1

recv()은 파이프에서 다음 값을 가져오고 마지막 값은 가져 오지 않습니다. 다른 사 후

2, 3, 4 

을 :

그래서, 4 반복 한 후, fpipesend 4 개 항목을했다, 그래서 파이프는 다음과 같습니다

1, 2, 3, 4 

및 주요 처리 할 recv1send의 반복 :

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

및 주 프로세스 recv2입니다. 마지막 하나만 수신하려면 먼저 파이프를 비워야합니다.

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