【发布时间】:2014-05-20 08:28:46
【问题描述】:
关于这个帖子:Python del Statement,
我最近遇到了以下sn-p:
# custom_process.py
import threading
import subprocess
myList = [] # module-wide list
class Foo(threading.Thread):
myprocess = None
returncode = None
def run(self):
self.myprocess = subprocess.Popen(...)
global myList
myList.append(self.myprocess)
... # Code skipped for brevity
self.returncode = self.myprocess.returncode
tmp1, tmp2 = self.myprocess.communicate()
... # Code skipped for brevity
del self.myprocess
此代码在连续调用Foo 的run 方法时,将用尽系统上的可用文件描述符并抛出异常:@987654325 @。
因此我想知道...在处理子进程对象时,文件描述符是否与实际的 OS 进程一起关闭,或者当 Python 子进程对象的引用计数变为零时?
提前致谢。
【问题讨论】:
-
你为什么把它存储在
myList? -
@thefourtheye 无目的。我现在知道我不应该。然而,存储在该列表中会导致大量错误,现在让我有机会更好地了解 python 的工作原理。这就是你进来的地方。别管我为什么把它放在那个地方。我关心的是了解为什么这会给我带来错误。
-
@Konos5 - 您不必将 myList 声明为 global - 如果找不到,解释器会在外部范围内找到它在本地范围内。如果您以这种方式使用 myList += self.myprocess,您将需要 global 运算符 - 但这(在大多数情况下)几乎与使用 全球
-
如果你在 *nix 上,你试过
close_fds=True吗?
标签: python list reference subprocess python-multithreading