【问题标题】:Python timer start and resetPython计时器启动和重置
【发布时间】:2019-06-12 16:34:52
【问题描述】:

我正在尝试让计时器功能在 Python(当前为 Python 2.7)中工作。

这是我目前所拥有的。我正在努力解决线程问题并重置计时器。

from threading import Timer

def api_call():
    print("Call that there api")

t = Timer(10.0,api_call)


def my_callback(channel):

    if something_true:
        print('reset timer and start again')
        t.cancel()
        t.start()
        print("\n timer started")
    elif something_else_true:
        t.cancel()
        print("timer canceled")
    else:
       t.cancel()
       print('cancel timer for sure')

try:
    if outside_input_that_can_happen_a_lot:
        my_callback()

finally:
    #cleanup objects

基本上,my_callback() 可以非常快速地调用很多次,并且可以命中“if”、“elif”或“else”语句的任何部分。

我遇到的问题是,当something_true 变量为真时,它将启动一个计时器。 第一次效果很好。之后每次调用它,我都会收到一个线程错误,告诉我只有一个线程可以用于计时器。

基本上,我希望能够在第一个“if”上重置我的计时器,并在“elif”或“else”被击中时取消。

【问题讨论】:

  • 请添加更具体的代码,而不是 outside_input_that_can_happen_a_lotsomething_true
  • 嗨@Devesh,我试图让它尽可能简单。你要什么代码?
  • 如果我的解决方案here 适合您,您可以尝试一下,它会为您处理重置,您可以简单地timelord.reset(interval)

标签: python multithreading python-2.7 timer


【解决方案1】:

根据我的测试,这是因为线程只能启动一次,并且由于计时器依赖于线程,因此计时器只能启动一次。 这意味着重新启动计时器的唯一方法是:

def newTimer():
    global t
    t = Timer(10.0,api_call)
newTimer()

而不是 t = Timer 部分,然后做

t.cancel()
newTimer()
t.start()

而不是当前的重新启动代码。

这就是你的完整代码:

from threading import Timer

def api_call():
    print("Call that there api")

def newTimer():
    global t
    t = Timer(10.0,api_call)
newTimer()


def my_callback(channel):

    if something_true:
        print('reset timer and start again')
        t.cancel()
        newTimer()
        t.start()
        print("\n timer started")
    elif something_else_true:
        t.cancel()
        print("timer canceled")
    else:
       t.cancel()
       print('cancel timer for sure')

try:
    if outside_input_that_can_happen_a_lot:
        my_callback()

finally:
    #cleanup objects

希望这会有所帮助。

【讨论】:

  • 嗨@crazysqueak,这是否意味着我可能创建了大量的计时器?所以每次调用时,我有 1+n 定时器吗?还是只有 1 个 Timer?
  • Python 会自动删除未被任何变量引用的对象(即定时器)。当 newTimer() 运行时,t 被设置为一个新的 Timer,并且旧的 Timer 被丢弃,因为它不再有任何变量引用它。这意味着它仍然只是 1 个计时器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
相关资源
最近更新 更多