別のスレッドで実行されている長時間実行プロセスの実行を終了しようとすると、問題が発生します。
以下はプログラムです。WorkOneはサブプロセスを作成し、ログ行を生成する長時間実行プロセス「adblogcat」を実行します。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]を取得することを期待すべきだと思います。ここで何が問題になっていますか?