如果我在Python解释器中创建一个具有令人无法接受的大量进程的池,它显然会出现错误,但是在执行此操作之前看起来似乎没有清除分叉进程,因此环境很脏,系统的其余部分无法分叉进程。
>>> from multiprocessing import Pool
>>> p = Pool(1000)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/__init__.py", line 232, in Pool
return Pool(processes, initializer, initargs, maxtasksperchild)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 159, in __init__
self._repopulate_pool()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 222, in _repopulate_pool
w.start()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 130, in start
self._popen = Popen(self)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 121, in __init__
self.pid = os.fork()
OSError: [Errno 35] Resource temporarily unavailable
>>> p = Pool(1)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/__init__.py", line 232, in Pool
return Pool(processes, initializer, initargs, maxtasksperchild)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 159, in __init__
self._repopulate_pool()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 222, in _repopulate_pool
w.start()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py", line 130, in start
self._popen = Popen(self)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py", line 121, in __init__
self.pid = os.fork()
OSError: [Errno 35] Resource temporarily unavailable
有没有办法避免/解决这个问题,还是被视为错误?
答案 0 :(得分:2)
有没有办法避免/解决这个问题,
不要那样做。
还是被视为错误?
是的,如果初始化程序失败,则应分配所有分配的资源。您应该检查您正在使用的2.7的特定构建,并查看在以后的构建中是否修复了任何特定于多处理的库错误(2.7.6发行说明:http://hg.python.org/cpython/raw-file/99d03261c1ba/Misc/NEWS)。
我假设您的平台是基于堆栈跟踪中的路径的OSX。这篇文章是关于errno 35的帖子(在OSX中似乎是EAGAIN) - I can't run more than 100 processes
无论您尝试完成什么,似乎您需要在应用程序级别上限制资源使用。这意味着您可能需要重新考虑您的解决方案。使用您目前的解决方案并修复错误,您仍然可能会在其他环境中看到系统范围内的资源限制。
答案 1 :(得分:2)
我遇到了同样的问题,并且根据Dustin的评论能够修复它。
票证:http://bugs.python.org/issue19675
我在Mac OS Mavericks上使用Python 2.7.8
答案 2 :(得分:0)
在我的情况下,应在要运行该功能的终端中设置“ ulimit -n 2048”。数字2048可能更高。它解决了我的问题。