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你的链接让我学到了很多东西,再次感谢你!