【发布时间】:2012-01-29 07:20:15
【问题描述】:
我遇到了一个问题,即应该几乎立即返回的子进程调用最终阻塞(实际的子进程已失效且未清理)。这似乎只发生在我也使用线程时。下面的程序很好地再现了我所看到的。通过运行它,您会看到主机名打印了很多次,数字在范围内循环,直到它阻塞。我怀疑一旦一个线程完成,已经失效的进程将被清理,然后它会再次发生。
任何人都了解正在发生的事情以及如何在不发生这种情况的情况下同时使用线程和子进程?我在 Ubuntu 11.4 上使用 Python 2.7.1+。
import os
import subprocess
import threading
class DummyThread(threading.Thread):
def run(self):
proc = subprocess.Popen(['sleep', '100'])
proc.wait()
while True:
dummy = DummyThread()
dummy.start()
for i in range(10):
print i
subprocess.check_call(['hostname'])
运行这个会导致子进程失效并阻塞主线程:
user 28665 10543 1 22:55 pts/2 python blocker.py
user 28667 28665 0 22:55 pts/2 sleep 100
user 28679 28665 0 22:55 pts/2 sleep 100
user 28691 28665 0 22:55 pts/2 sleep 100
user 28703 28665 0 22:55 pts/2 sleep 100
user 28715 28665 0 22:55 pts/2 sleep 100
user 28727 28665 0 22:55 pts/2 sleep 100
user 28739 28665 0 22:55 pts/2 sleep 100
user 28751 28665 0 22:55 pts/2 sleep 100
user 28763 28665 0 22:55 pts/2 sleep 100
user 28775 28665 0 22:55 pts/2 sleep 100
user 28787 28665 0 22:55 pts/2 sleep 100
user 28799 28665 0 22:55 pts/2 sleep 100
user 28800 28665 0 22:55 pts/2 [hostname] <defunct>
【问题讨论】:
-
不管你想做什么,用线程轰炸自己可能是个坏主意......
-
同意 - 在我的项目中,我最多只启动 4 个线程。以上重现了相同的行为。也许我的资源快用完了?
-
您能否更新示例以启动有限数量的线程,并检查它是否仍然导致问题。
-
可能你的文件描述符用完了。
标签: python python-multithreading subprocess