Nauczyłem się ostatnio używać modułu wieloprocesorowego Python i czytania oficjalnego dokumentu. W dokumencie 16.6.1.2. Exchanging objects between processes znajduje się prosty przykład użycia potoku do wymiany danych.Python multiplerocessing pipe recv() doc niejasne czy czy brakowało mi czegoś?
A w 16.6.2.4. Connection Objects, jest to stwierdzenie, cytowany „Podnosi EOFError jeśli nie ma nic do otrzymania, a drugi koniec był zamknięty.”
Tak więc poprawiłem przykład pokazany poniżej. IMHO powinno to wywołać wyjątek: EOFError: nic nie zostało wysłane, a koniec wysyłający jest zamknięty.
Zmieniony kod:
from multiprocessing import Process, Pipe
def f(conn):
#conn.send([42, None, 'hello'])
conn.close()
if __name__ == '__main__':
parent_conn, child_conn = Pipe()
p = Process(target=f, args=(child_conn,))
p.start()
#print parent_conn.recv() # prints "[42, None, 'hello']"
try:
print parent_conn.recv()
except EOFError:
pass
p.join()
Ale kiedy próbowałem zmieniony przykład na moim Ubuntu 11.04 maszynie, Python 2.7.2, skrypt powiesić.
Jeśli ktoś może wskazać mi, co przegapiłem, byłbym bardzo wdzięczny.
proszę usunąć „lub ma błąd”. Prawdopodobieństwo błędu wynosi prawie zero. Skoncentruj się na prawdopodobnym wytłumaczeniu - źle odczytanej lub niejasnej dokumentacji. –
@ S.Lott, miałeś rację. To moje przeoczenie - wcale nie błąd. Zapomniałem o liczeniu referencji Pythona i najlepszej praktyce korzystania z rur dupleksowych. – user183394