Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
可以通过检查Python计时器是否存在来取消它吗?_Python_Multithreading_Timer - Fatal编程技术网

可以通过检查Python计时器是否存在来取消它吗?

可以通过检查Python计时器是否存在来取消它吗?,python,multithreading,timer,Python,Multithreading,Timer,我想检查计时器是否存在,并通过再次运行以下代码来停止它,但它会等待计时器停止 然后又跑了 import time import threading def run(): print("foobar") t = threading.Timer(3, run) def stop_t(): time.sleep(1) t.cancel() print("canceled") if t.is_alive(): t.cancel() else:

我想检查计时器是否存在,并通过再次运行以下代码来停止它,但它会等待计时器停止 然后又跑了

import time
import threading


def run():
    print("foobar")

t = threading.Timer(3, run)

def stop_t():
    time.sleep(1)
    t.cancel()
    print("canceled")


if t.is_alive():
    t.cancel()
else:
    t.start()

问题是,如果您再次运行此代码,您会将t变量重新定义为尚未启动的新计时器,您可以尝试以下操作:

import time
import threading


def run():
    print("foobar")

def toggle_timer(t):
    if t.is_alive():
        print('timer is alive, killing it')
        t.cancel()
    else:
        t.start()
        print('timer is dead, starting it')

t = threading.Timer(3, run)
toggle_timer(t)
toggle_timer(t)
输出:

计时器已停止,正在启动它

定时器是活的,正在杀死它


问题是,如果您再次运行此代码,您会将t变量重新定义为尚未启动的新计时器,您可以尝试以下操作:

import time
import threading


def run():
    print("foobar")

def toggle_timer(t):
    if t.is_alive():
        print('timer is alive, killing it')
        t.cancel()
    else:
        t.start()
        print('timer is dead, starting it')

t = threading.Timer(3, run)
toggle_timer(t)
toggle_timer(t)
输出:

计时器已停止,正在启动它

定时器是活的,正在杀死它


我不能完全理解你的问题,你能详细说明吗?你说的存在是指开始正确吗?因为
is_alive()
告诉您计时器是否已启动,是的,指向启动计时器<,然后代码再次运行检查计时器,如果处于等待阶段,请停止。我试图向您解释问题并在回答中告诉您如何解决,请告诉我这是否解决了您的问题。我无法完全理解您的问题,你能详细说明一下吗?你说的存在是指开始正确吗?因为
is_alive()
告诉您计时器是否已启动,是的,指向启动计时器<,然后代码再次运行检查计时器,如果处于等待阶段,请停止。我试图向您解释问题并在回答中告诉您如何解决,如果这无法解决您的问题,请告诉我。谢谢您的帮助,但这是在代码执行时有效的,我需要用start timer运行这段代码两次,然后停止它,但是(?)它等待timer<的回调,然后不再启动。例如,如果start stop_t func的延迟小于timer,它可以正常工作,并且可以取消它,问题是,如果我试图在计时器处于活动状态时执行代码,它的等待计时器事件将再次启动。感谢您的帮助,但这在代码执行时是有效的,我需要使用start Timer运行此代码两次并停止它,但(?)它将等待来自Timer<的回调,而不是再次启动。例如,如果start stop_t func,当延迟小于计时器时,它可以正常工作,并且可以正确地取消它,问题是如果我试图在计时器处于活动状态时执行代码,它的等待计时器事件会再次启动它。