2011-12-21 25 views
5

Tôi đã học cách sử dụng mô-đun đa xử lý Python gần đây và đọc tài liệu chính thức. Trong 16.6.1.2. Exchanging objects between processes có một ví dụ đơn giản về cách sử dụng đường ống để trao đổi dữ liệu.Python đa xử lý ống recv() doc không rõ ràng hoặc tôi đã bỏ lỡ bất cứ điều gì?

Và, trong 16.6.2.4. Connection Objects, có tuyên bố này, được trích dẫn "Tăng EOFError nếu không còn gì để nhận và đầu kia đã bị đóng".

Vì vậy, tôi đã sửa đổi ví dụ như được hiển thị bên dưới. IMHO này sẽ kích hoạt một ngoại lệ EOFError: không có gì được gửi và kết thúc gửi sẽ bị đóng.

Mã sửa đổi:

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() 

Tuy nhiên, khi tôi đã cố gắng sửa đổi ví dụ trên máy tính Ubuntu 11.04 của tôi, Python 2.7.2, kịch bản treo.

Nếu có ai có thể chỉ ra cho tôi những gì tôi đã bỏ lỡ, tôi sẽ rất cảm kích.

+0

Hãy loại bỏ các "hoặc có lỗi". Xác suất của một lỗi gần bằng không. Tập trung vào lời giải thích có khả năng - tài liệu chưa đọc hoặc không rõ ràng. –

+0

@ S.Lott, bạn đã đúng. Đó là sự giám sát của tôi - không phải là lỗi. Quên về tính toán tham chiếu của Python và cách thực hành tốt nhất khi sử dụng đường ống song công. – user183394

Trả lời

8

Khi bạn bắt đầu một quy trình mới với mp.Process, quá trình con kế thừa các đường ống của phụ huynh. Khi đứa trẻ đóng conn, quá trình cha mẹ vẫn còn child_conn mở, do đó số tham chiếu cho bộ mô tả tệp đường ống vẫn lớn hơn 0 và do đó EOFError không được nâng lên.

Để có được EOFError, đóng phần cuối của đường ống trong cả quá trình cha mẹ và con:

import multiprocessing as mp 

def foo_pipe(conn): 
    conn.close() 

def pipe(): 
    conn = mp.Pipe() 
    parent_conn, child_conn = conn 
    proc = mp.Process(target = foo_pipe, args = (child_conn,)) 
    proc.start() 
    child_conn.close() # <-- Close the child_conn end in the main process too. 
    try: 
     print(parent_conn.recv()) 
    except EOFError as err: 
     print('Got here') 
    proc.join() 

if __name__=='__main__': 
    pipe() 
Các vấn đề liên quan