我在停止循环线程时遇到问题。我使用一个事件来停止循环,但输出与我预期的不同。我写了以下代码
import threading
from time import sleep
class foo(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.stop_event = threading.Event()
def run(self):
while not self.stop_event.is_set():
print('1')
sleep(1)
print('2')
sleep(1)
print('done')
class bar(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.run_thread()
def run_thread(self):
th1 = foo()
th1.start()
sleep(4)
th1.stop_event.set()
prgm = bar()
prgm.run_thread()
给我输出:
1
2
1
2
1
done
2
1
2
done
我期待“完成”这个词。当while循环结束时打印onces。但出于某种原因,已经完成了#39;打印两次。我使用的事件是错误的还是线程多次启动?
答案 0 :(得分:1)
您已在self.run_thread()
(即bar
)的构造函数中执行bar.__init__
:
class bar(...):
def __init__(self):
threading.Thread.__init__(self)
# !!!!
self.run_thread()
因此,当您创建bar
的实例时:
stuff = bar()
您正在执行bar.run_thread
。您当前的代码执行此函数两次:
prgm = bar() # executed here
prgm.run_thread() # and here
因此,您会遇到一些意外行为。
答案 1 :(得分:0)
缺少两点:
if __name__ == '__main__':
prgm = bar()
sleep(0.1)A
run...
醇>