Я столкнулся с проблемой, когда вызовы подпроцесса, которые должны возвращаться почти немедленно, в конечном итоге блокируются (фактический дочерний процесс не функционирует и не очищается). Это происходит только тогда, когда я использую темы. Программа ниже хорошо воспроизводит то, что я вижу. Запустив его, вы увидите имя хоста, распечатанное несколько раз с числом, циклически изменяющим диапазон, пока оно не заблокируется. Я подозреваю, что после завершения потока очищенный процесс будет очищен, а затем произойдет снова.
Кто-нибудь знает, что происходит, и как я могу использовать как потоки, так и подпроцессы без этого? Я использую 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>