在thread.start()之后运行时子进程失效

时间:2012-01-29 07:20:15

标签: python python-multithreading subprocess

我遇到了一个问题,即子进程调用几乎立即返回,最终阻塞(实际的子进程已经不存在且未被清除)。这似乎只发生在我也在使用线程时。以下程序很好地再现了我所看到的。通过运行它,你会看到主机名打印了很多次,数字在整个范围内循环,直到它阻塞。我怀疑一旦线程完成,就会清理已失效的进程,然后再次发生。

任何人都可以了解发生了什么以及如何在不发生这种情况的情况下使用线程和子进程?我在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>

1 个答案:

答案 0 :(得分:2)

我在ubuntu 12.04(python 2.7.3)和OS X 10.8(python 2.7.2)上重现了这个问题。

如果在调用subprocess.Popen和subprocess.check_call时设置close_fds = True,问题就会消失。

我不确定这意味着什么,但它可以帮助有更多知识的人完全回答这个问题。