當我試圖終止運行在單獨的線程上運行的長時間運行的進程時,我遇到了問題。嘗試終止在線程上運行的python子進程時的行爲不一致
以下是程序。 WorkOne創建一個子進程並運行一個長時間運行的進程「adb logcat」來生成日誌行。我在main()中啓動WorkOne,等待5秒鐘並嘗試停止它。多次運行提供了多重輸出
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()
有時我得到[A]:
starting worker1
number of threads: 2
number of threads: 2
exited For
有時候我[B]:
starting worker1
number of threads: 2
number of threads: 1
exited For
有時候我[C]:
starting worker1
number of threads: 2
number of threads: 2
我想我應該期望得到[B]所有的時間即這裏出了什麼問題?
由於您在'join()'調用中設置了超時,即使該線程已停止(例如,它正在等待'for'循環中的新行),也可以使線程保持活動狀態。 – 2013-03-18 01:57:56
看起來像是這樣的問題,將for循環中的terminate和kill調用移至stop方法,現在我得到了我期望的一致輸出 – Harkish 2013-03-18 02:26:43