我有一个python线程,它应该每秒显示一条消息,而其余的脚本继续运行。但是timer.cancel
函数不起作用,因为即使在主循环终止后它仍然保持运行:
from threading import *
import time
import sys
a = 0
def x():
while(True):
global a
print
print 'Beep', a
print
time.sleep(1) # wait 1 second
t = Timer(1.0, x) # create thread
t.start() # start thread
while True:
a = a + 1
print a
time.sleep(0.1)
if a > 30:
t.cancel()
if a > 50:
sys.exit()
我做错了什么?
答案 0 :(得分:2)
threading.Timer
类有一个cancel
方法,但不会取消该线程,它会阻止计时器实际触发。实际上,cancel
方法设置了一个threading.Event
,实际执行threading.Timer
的线程将在等待完成之后以及实际执行回调之前检查该事件。
这可能是一个solution来满足您的要求。
import threading
import time
import sys
a = 0
class TimerClass(threading.Thread):
def __init__(self):
threading.Thread.__init__(self)
self.event = threading.Event()
def run(self):
while not self.event.is_set():
global a
print
print 'Beep', a
print
self.event.wait(1)
def stop(self):
self.event.set()
t = TimerClass()
t.start()
while True:
a = a + 1
print a
time.sleep(0.1)
if a > 30:
t.stop()
if a > 50:
sys.exit()
答案 1 :(得分:0)
尽管你的a = a + 1部分已经停止,你的线程代码问题就是你的蜂鸣声部分正在执行,即使你的a = a + 1部分是停止的,所以你可以做的就是在蜂鸣声中增加一个条件部分为:
time.sleep(1)
if a>50:
sys.exit()
这将停止执行线程,您将获得所需的结果 这是你可以做的最简单的事情,或者遵循zangw方法(),它适用于线程的运行和停止