Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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多处理池恢复后;“资源暂时不可用”;_Python_Multiprocessing_Pool - Fatal编程技术网

Python多处理池恢复后;“资源暂时不可用”;

Python多处理池恢复后;“资源暂时不可用”;,python,multiprocessing,pool,Python,Multiprocessing,Pool,如果我在Python解释器中创建了一个进程数量高得令人无法接受的池,那么它显然会出错,但是这样做之前似乎不会清理分叉的进程,因此会使环境变脏,系统的其余部分无法分叉进程 >>> from multiprocessing import Pool >>> p = Pool(1000) Traceback (most recent call last): File "<stdin>", line 1, in <module> File

如果我在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
来自多处理导入池的
>
>>>p=池(1000)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/_init__.py”,池中的第232行
返回池(进程、初始值设定项、initargs、maxtasksperchild)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第159行,在__
自我重新填充池()
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第222行,在重新填充池中
w、 开始()
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py”,第130行,开始
self.\u popen=popen(self)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py”,第121行,在__
self.pid=os.fork()
OSError:[Errno 35]资源暂时不可用
>>>p=池(1)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/_init__.py”,池中的第232行
返回池(进程、初始值设定项、initargs、maxtasksperchild)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第159行,在__
自我重新填充池()
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py”,第222行,在重新填充池中
w、 开始()
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/process.py”,第130行,开始
self.\u popen=popen(self)
文件“/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/forking.py”,第121行,在__
self.pid=os.fork()
OSError:[Errno 35]资源暂时不可用
是否有某种方法可以避免/纠正此问题,或者将其视为一个bug

有没有办法避免/补救这种情况

不要那样做

或者它被认为是一个bug

是,即如果初始值设定项失败,则应取消分配所有分配的资源。您应该检查正在使用的特定版本2.7,并查看是否有任何特定于多处理的库错误在以后的版本中修复(2.7.6发行说明:)

我假设您的平台是基于stacktrace中的路径的OSX。这里有一篇关于Errno35(在OSX中似乎是EAGAIN)的帖子,在分叉时-


无论您试图完成什么,似乎都需要在应用程序级别对资源使用进行限制。这意味着您可能需要重新考虑您的解决方案。有了您目前的解决方案和修复的bug,您仍然可能会看到资源限制在其他情况下影响到整个系统。

我遇到了同样的问题,根据Dustin的评论,它能够修复它

门票:


我在Mac OS Mavericks上使用的是Python 2.7.8。在我的例子中,您应该在要运行函数的终端中设置“ulimit-n 2048”。2048的数字可能更高。它解决了我的问题。

p.close()?(所以说我必须添加更多字符,但我没有更多的话要说…)你的操作系统?(我也是,没什么好问的:)因为调用导致异常,所以p显然不存在。这是OSX,但这不重要。不幸的是,我无法在任何其他系统上进行测试,因为它们的进程限制太高,我会在进程限制达到之前耗尽其他资源。您需要终止以前的会话。检查一下,谢谢。我没有办法。我只是在控制台上创建了一个池,当我遇到这样一个错误时,我不得不重新启动解释器。听起来你对问题、原因和补救措施都有很好的理解。多处理池类是纯Python。你可以尝试用清理代码修补它,甚至向上游提交。我同意。谢谢,杰里米,谢谢。想一想评论一下实际的bug,给它一点动力。我对pyhton是新手,这里有点困惑。如果我根据这个补丁文件更新pool.py文件,它就解决了问题。那么,这难道不意味着bug已经解决,python的未来迭代将得到更新的pool.py文件吗?还有,为什么罚单上说当补丁文件存在时打开?嗯,有什么后续的吗?有趣的是,一张2.5年前开放的门票现在仍然开放:/