Python线程无法取消

时间:2016-01-19 03:51:28

标签: python multithreading

我有一个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()

我做错了什么?

2 个答案:

答案 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方法(),它适用于线程的运行和停止