Tôi đang gửi các đối tượng đơn giản giữa các quy trình sử dụng các đường ống với mô-đun đa xử lý của Python. Tài liệu nói rằng nếu một đường ống đã bị đóng, gọi pipe.recv() sẽ tăng EOFError. Thay vào đó, chương trình của tôi chỉ chặn trên recv() và không bao giờ phát hiện rằng đường ống đã bị đóng.Tại sao không pipe.close() gây ra EOFError trong pipe.recv() trong python multiprocessing?
Ví dụ:
import multiprocessing as m
def fn(pipe):
print "recv:", pipe.recv()
print "recv:", pipe.recv()
if __name__ == '__main__':
p1, p2 = m.Pipe()
pr = m.Process(target=fn, args=(p2,))
pr.start()
p1.send(1)
p1.close() ## should generate EOFError in remote process
Và kết quả có dạng:
recv: 1
<blocks here>
bất cứ ai có thể cho tôi biết những gì tôi đang làm sai? Tôi có vấn đề này trên Linux và windows/cygwin, nhưng không phải với cửa sổ gốc Python.
Tất nhiên điều này là đúng để xác định lý do tại sao việc đóng ống không được liên lạc giữa quá trình cha và con, như trên Windows (và như các tài liệu cho thấy nó nên). – Luke
Ok, khi kiểm tra lại, bạn hoàn toàn chính xác (và tôi đã không hiểu đúng câu trả lời của bạn). Các đường ống không được coi là 'đóng' cho đến khi tất cả các quá trình bằng cách sử dụng bộ mô tả tập tin đã đóng nó. – Luke
Một kết quả thú vị/vụng về của việc này là cần phải gửi cả hai đầu của đường ống đến các tiến trình con để chúng có thể đóng một cách rõ ràng. – Luke