[英]MultiProcessing Pipe recv blocks even when child process is defunct
閱讀關於這個主題的幾個問題我現在明白子進程從父進程繼承文件描述符。 當父母關閉連接時,這將使孩子更難收到 EOFError 。
但我的情況正好相反,我不明白我面臨的問題。
我有一個啟動子進程的父進程,並允許它訪問我創建的管道連接的一端。 現在,當子進程完成、出現故障或其他任何情況時,一切都會停止並關閉連接。 此時子進程顯示已失效。
然后我希望父進程的連接在阻塞 recv 調用上拋出一個 EOFError 。 但它只是坐在那里等待。
我在這里缺少什么?
編輯
我認為這個例子代表了問題:
from multiprocessing import Process, Pipe
from threading import Thread
import time
class Parent(object):
def __init__(self):
self.parent_conn, child_conn = Pipe()
self.child = Process(target=Child, args=(child_conn,))
self.child.start()
def recv():
try:
self.parent_conn.recv()
except EOFError:
print "EOF"
except:
print "something else"
# Does not work
recv()
# Works fine
t = Thread(target=recv)
t.setDaemon(True)
t.start()
def close(self):
self.parent_conn.close()
self.child.join()
class Child(object):
def __init__(self, conn):
conn.close()
if __name__ == "__main__":
p = Parent()
time.sleep(1)
p.close()
如果我確實使用單獨的線程,則允許父級關閉自己的連接並且一切正常。 (請注意,您仍然需要以某種方式知道子進程已完成,以執行此操作)相反,如果我直接調用 recv 它將明顯阻塞,但我懷疑它會在子進程關閉其連接后立即引發 EOFError 。 但事實並非如此。 任何人都可以澄清嗎?
在child_conn.close()
之后添加child_conn.close()
self.child.start()
。 使用管道關閉未使用的末端是慣用的做法。 還(可選)提供duplex=False
參數。
事情是,我事先不知道它是否會立即關閉..通常孩子應該能夠發送和接收。 此外,我仍然不明白為什么這不起作用。
child_conn.close()
並不意味着子級應立即關閉其末端child_conn.send()
, parent_conn.recv
就不會返回。 如果child_conn
被打開(子女或父母),那么有機會如果我確實使用單獨的線程,則允許父級關閉自己的連接並且一切正常。 請注意,您仍然需要以某種方式知道孩子已經完成,要做到這一點
你不需要知道。 您可以在孩子中打開連接后立即關閉。 調用child_conn.close()
在父后self.child.start()
是罰款什么的孩子不。
您能否再解釋一下雙工選項?
duplex=False表示管道是單向的,即您只能調用parent_conn.recv()
和child_conn.send()
。 否則它是雙向的,並且兩個連接都支持發送/接收。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.