별도의 스레드에서 실행되는 장기 실행 프로세스를 종료하려고 할 때 문제가 발생합니다.스레드에서 실행중인 python 하위 프로세스를 종료 할 때 일관성없는 동작이 발생했습니다.
아래는 프로그램입니다. WorkOne은 서브 프로세스를 작성하고 로그 행을 생성하는 장기 실행 프로세스 "adb logcat"을 실행합니다. main()에서 WorkOne을 시작하고 5 초 동안 기다렸다가 멈추려 고 시도합니다. 다수의 실행은 다중 출력
제공 가끔 [A] 얻을import threading
import time
import subprocess
import sys
class WorkOne(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.event = threading.Event()
self.process = subprocess.Popen(['adb','logcat'], stdout=subprocess.PIPE, stderr=sys.stdout.fileno())
def run(self):
for line in iter(self.process.stdout.readline,''):
#print line
if self.event.is_set():
self.process.terminate()
self.process.kill()
break;
print 'exited For'
def stop(self):
self.event.set()
def main():
print 'starting worker1'
worker1 = WorkOne()
worker1.start()
print 'number of threads: ' + str(threading.active_count())
time.sleep(5)
worker1.stop()
worker1.join(5)
print 'number of threads: ' + str(threading.active_count())
if __name__ == '__main__':
main()
:
starting worker1
number of threads: 2
number of threads: 1
exited For
때때로 I는 [C]를 얻을 :
가starting worker1
number of threads: 2
number of threads: 2
exited For
때때로 I는 [B]를 얻을
starting worker1
number of threads: 2
number of threads: 2
나는 [B] 모든 시간을 기대해야한다고 생각합니다. 이자형. 여기서 뭐가 잘못 됐어?
'join()'호출에서 타임 아웃을 설정했기 때문에, 스레드가 멈춘 경우에도 (예를 들어'for' 루프에서 새로운 라인을 기다리고 있습니다.) 스레드가 살아있을 수 있습니다. –
그게 문제 같아서, for 루프에서 stop 메소드로 호출을 종료하고 끝내고, 이제는 기대했던 일관된 출력을 얻습니다. – Harkish