Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 多个fork调用导致BlockingIOError_Python_Macos_Python 3.x_Fork - Fatal编程技术网

Python 多个fork调用导致BlockingIOError

Python 多个fork调用导致BlockingIOError,python,macos,python-3.x,fork,Python,Macos,Python 3.x,Fork,我正在搜索有关以下代码段错误的解释: #!/usr/bin/env python3 import os, sys if __name__ == '__main__': while True: pid = os.fork() if pid == 0: sys.exit() elif pid > 0: pass # os.waitpid(pid, 0)

我正在搜索有关以下代码段错误的解释:

#!/usr/bin/env python3

import os, sys

if __name__ == '__main__':
    while True:
        pid = os.fork()
        if pid == 0:
            sys.exit()
        elif pid > 0:
            pass
            # os.waitpid(pid, 0)
        else:
            sys.exit()
这将产生许多进程(在产生时退出的进程)

这最终会导致
BlockingIOError
如下所示:

Traceback (most recent call last):
  File "./asd.py", line 7, in <module>
    pid = os.fork()
BlockingIOError: [Errno 35] Resource temporarily unavailable
回溯(最近一次呼叫最后一次):
文件“/asd.py”,第7行,在
pid=os.fork()
BlockingIOError:[Errno 35]资源暂时不可用
但是当
os.waitpid
调用未注释时,一切似乎都正常

为什么会发生此错误,此
waitpid
调用可能会改变什么?

这是相同的问题;错误信息就是如何向您传达
EAGAIN

  • 你的记性不好或者
  • 您已达到进程限制(例如,
    RLIMIT\u NPROC
  • waitpid
    修复了它,因为它获取了僵尸子进程;在此之前,这些进程将计入cap(必须保留它们,以便父进程可以查看终止信息)


    您可以查看上记录的各种
    fork
    错误代码。

    感谢您提供了这一非常有用的答案。我有一个程序,它通过大量的
    fork
    调用来生成可能超时的进程。在这种情况下,进程被父进程用os.kill杀死(根据您的回答,这是不够的)。如果我能很好地理解您的答案,那么就调用
    waitpid()
    来处理同样超时的进程。但是,有没有一种功能可以只“收获”这些过程而不检索信息呢,?(因为我不需要它,因为我知道在这种情况下进程是如何终止的)。@vmonteco:您可以让父进程全局选择不处理子进程,方法是;Python提供对
    signal
    模块中的信号处理程序设置的访问。这意味着您无法获取已退出的子级的退出状态。还有一个double-
    fork
    +
    setsid
    解决方案,用于创建具有类似效果的守护进程(您可以立即获取中间子进程,并分离孙子进程)。我查看了您的注释,最后waitpid()似乎是最好的解决方案(我仍然需要获得其他进程的退出状态,设置孙子进程似乎毫无意义地复杂)。Yey你的链接让我学到了很多东西,再次感谢你!