1

当我运行创建大量子进程的脚本时,我似乎遇到了 Python 问题。子流程创建代码类似于:

代码:

def execute(cmd, stdout=None, stderr=subprocess.STDOUT, cwd=None):
    proc = subprocess.Popen(cmd, shell=True, stdout=stdout, stderr=stderr, cwd=cwd)
    atexit.register(lambda: __kill_proc(proc))
    return proc

我收到的错误消息是:

OSError: [Errno 24] 打开的文件太多

一旦发生此错误,我将无法创建任何进一步的子进程,直到终止脚本并重新启动它。我想知道以下行是否负责。

atexit.register(lambda: __kill_proc(proc))

可能是这一行创建了对子进程的引用,导致“文件”保持打开状态,直到脚本退出?

4

2 回答 2

1

所以似乎这条线:

atexit.register(lambda: __kill_proc(proc))

确实是罪魁祸首。这可能是因为 Popen 引用被保留,所以进程资源没有被释放。当我删除该行时,错误消失了。我现在已经按照@Bakuriu 的建议更改了代码,并且正在使用进程的 pid 值而不是 Popen 实例。

于 2012-09-25T17:25:11.053 回答
0

首先,运行ulimit -a以找出您的 Linux 系统中设置的最大打开文件数。

然后编辑系统配置文件/etc/security/limits.conf并在底部添加这些代码。

* - nofile 204800

然后,您可以根据需要打开更多子进程。

于 2017-09-06T10:00:01.223 回答