【问题标题】:subprocess goes defunct when ran after thread.start()子进程在 thread.start() 之后运行时失效
【发布时间】: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


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-08-01
    • 2023-03-08
    • 1970-01-01
    • 2015-01-04
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多