python - 打开文件过多并行 Python 子进程错误

标签 python subprocess parallel-python

类似问题的问题: Parallel Python - too many filesPython too many open files (subprocesses)

我正在使用并行Python [V1.6.2] 来运行任务。该任务处理输入文件并输出日志/报告。假设有 10 个文件夹,每个文件夹有 5000 ~ 20000 个文件,这些文件被并行读取、处理并写出日志。每个文件约50KB ~ 250KB

运行约 6 小时后,并行 Python 失败并出现以下错误。

  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 342, in __init__
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 506, in set_ncpus
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 140, in __init__
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 146, in start
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
  File "/usr/lib/python2.7/subprocess.py", line 1135, in _execute_child
  File "/usr/lib/python2.7/subprocess.py", line 1091, in pipe_cloexec
OSError: [Errno 24] Too many open files
Error in sys.excepthook:
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/apport_python_hook.py", line 66, in  apport_excepthook
ImportError: No module named fileutils

Original exception was:
Traceback (most recent call last):
  File "PARALLEL_TEST.py", line 746, in <module>
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 342, in __init__
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 506, in set_ncpus
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 140, in __init__
  File "/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py", line 146, in start
  File "/usr/lib/python2.7/subprocess.py", line 679, in __init__
  File "/usr/lib/python2.7/subprocess.py", line 1135, in _execute_child
  File "/usr/lib/python2.7/subprocess.py", line 1091, in pipe_cloexec
OSError: [Errno 24] Too many open files

据我了解,这可能是此处指出的子流程中的问题 http://bugs.python.org/issue2320 ,但是,似乎解决方案只是 Py V3.2 的一部分。我目前使用的是 Py V2.7。

我想知道以下建议是否有帮助: [1]http://www.parallelpython.com/component/option,com_smf/Itemid,1/topic,313.0

*) 在/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/pp.py< 的 destroy() 方法中添加worker.t.close()/p>

*) 增加/usr/local/lib/python2.7/dist-packages/pp-1.6.2-py2.7.egg/ppauto.py 中的 BROADCAST_INTERVAL

我想知道 Python V2.7 中是否有针对此问题的可用修复/解决方法。

提前致谢

最佳答案

我的团队最近在运行 celeryd 任务队列作业时偶然发现了一个类似的问题,即相同的文件处理资源耗尽问题。我相信OP已经解决了这个问题,它很可能是Python 2.7和Python 3.1中suprocess.py lib中的困惑代码。

按照 Python Bug#2320 中的建议,请在调用 subprocess.Popen() 的任何地方传入 close_fds=True 。事实上,他们在 Python 3.2 中将此设置为默认值,同时还修复了潜在的竞争条件问题。请参阅该票证中的更多详细信息。

关于python - 打开文件过多并行 Python 子进程错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13968290/

相关文章:

python - 在 tensorflow 中对一维张量使用 tf.Variable 时出错

python - 有没有更优雅的方法来过滤函数的失败结果?

python - 如何在路径的上下文中使用 '~'(波浪号)?

python - 从 TextIOWrapper 读取会导致 UnicodeDecodeError

python - 按自定义顺序展平 np.ndarray

python - 从 Python 运行 PowerShell 脚本

python - 从 python 启动多个二进制文件并监视它们的状态

python - 为什么 Parallel Python 的工作方式如此?

python - 如何使标准输出与并行 Python 一起工作?

python - 使用并行 python 并行化 networkx 中节点的循环