2012-09-21 48 views
1

我运行一个创建大量子进程的脚本时,我似乎遇到了Python的问题。子进程创建代码类似于: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] Too many open files

一旦发生错误,我无法创造任何进一步的子处理直到杀死脚本并再次启动它。我想知道下面这一行是否可以负责。

atexit.register(lambda: __kill_proc(proc)) 

难道是这条线创建了一个子过程的引用,导致“文件”保持打开,直到脚本退出?

+0

你用'proc'做了什么?你调用'communic()'或'wait()'或'terminate()/ kill()'?如果不是,那么很可能就是这样。 – Bakuriu

+1

也可以重写'__kill_proc'来使用进程pid而不是'Popen'实例。通过这种方式,你不会保留引用。试试看看行为是否改变。 – Bakuriu

+0

回应你的第一条评论:通常沟通()/等待()被调用。 回复第二评论:啊,好建议。我会试一试,看看它是否能解决问题。 – torbinsky

回答

1

如此看来,该行:

atexit.register(lambda: __kill_proc(proc)) 

确实是罪魁祸首。这可能是因为Popen参考被保留在周围,所以过程资源不是免费的。当我删除该行时,错误消失了。我现在已经改变了@Bakuriu所建议的代码,并且正在使用进程的pid值而不是Popen实例。

0

首先,运行ulimit -a以查明您的Linux系统中设置了多少最大打开文件。

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

* - nofile 204800

然后,如果你愿意,你可以打开更多的子进程。