簡體   English   中英

即使子進程不存在,MultiProcessing Pipe recv 也會阻塞

[英]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參數。

事情是,我事先不知道它是否會立即關閉..通常孩子應該能夠發送和接收。 此外,我仍然不明白為什么這不起作用。

  1. 父級中的child_conn.close()並不意味着子級應立即關閉其末端
  2. 只要有人可能會出現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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM