2017-02-04 11 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 

, но вместо этого, IDLE дал мне этот выход:

>>> 
1 
2 
3 
4 
5 

И так далее, пока не достигнет 20. Есть ли команда сброса буфера? или подобная вещь?

заблаговременно.

ответ

1

Проблема в том, что recv() получает следующее значение в трубе, а не последнее.

Таким образом, после 4-х итераций, f сделал send 4 пунктов в pipe, так что труба выглядит следующим образом:

1, 2, 3, 4 

и основной процесс будет recv1:

2, 3, 4 

еще через 4 итерации 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() для очистки трубы. но как это возможно? когда опрос() станет ложным? я имею в виду, что это должно быть в конце 20 правильно? или я что-то пропустил? это работает очевидно, но я просто озадачил, как это работает. спасибо – aji

+0

@aji 'poll' проверяет, есть ли в трубе элементы, которые могут быть получены, поэтому вы можете понять это как' has_elements'. Если 'poll' становится ложным, вы останавливаете цикл while. Опорожнение трубы выполняется повторением «recv». – hansaplast

 Смежные вопросы

  • Нет связанных вопросов^_^