подпроцесс перестает функционировать при запуске после thread.start () - PullRequest
2 голосов
/ 29 января 2012

Я столкнулся с проблемой, когда вызовы подпроцесса, которые должны возвращаться почти немедленно, в конечном итоге блокируются (фактический дочерний процесс не функционирует и не очищается). Это происходит только тогда, когда я использую темы. Программа ниже хорошо воспроизводит то, что я вижу. Запустив его, вы увидите имя хоста, распечатанное несколько раз с числом, циклически изменяющим диапазон, пока оно не заблокируется. Я подозреваю, что после завершения потока очищенный процесс будет очищен, а затем произойдет снова.

Кто-нибудь знает, что происходит, и как я могу использовать как потоки, так и подпроцессы без этого? Я использую Python 2.7.1+ в Ubuntu 11.4.

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 Ответ

2 голосов
/ 30 октября 2012

Я воспроизвел эту проблему на Ubuntu 12.04 (Python 2.7.3) и на OS X 10.8 (Python 2.7.2).

Проблема исчезнет, ​​если вы установите close_fds = True в ваших вызовах subprocess.Popen и subprocess.check_call.

Я не уверен, что это значит, но это может помочь кому-то, обладающему немного большими знаниями, полностью ответить на вопрос.

...