gpt4 book ai didi

Python - threading.Timer 在调用 cancel() 方法后保持事件状态

转载 作者:太空狗 更新时间:2023-10-29 17:26:42 26 4
gpt4 key购买 nike

我注意到以下代码中的以下行为(使用 threading.Timer 类):

import threading

def ontimer():
print threading.current_thread()

def main():
timer = threading.Timer(2, ontimer)
timer.start()
print threading.current_thread()
timer.cancel()
if timer.isAlive():
print "Timer is still alive"
if timer.finished:
print "Timer is finished"


if __name__ == "__main__":
main()

代码的输出是:

<_MainThread(MainThread, started 5836)>
Timer is still alive
Timer is finished

正如我们从输出中注意到的那样,计时器对象仍然存在并同时完成。

事实上,我想调用类似的函数数百次,我想知道那些“活着”的计时器是否会影响性能。

我想以适当的方式停止或取消计时器对象。我做得对吗?

谢谢

最佳答案

TimerThread 及其implementation 的子类真的很简单。它通过订阅事件 finished 来等待提供的时间。

因此,当您通过 Timer.cancel 设置事件时,可以保证不会调用该函数。但不保证Timer线程会直接继续(并退出)。

所以重点是定时器的线程在cancel执行后还可以存活,但是函数不会执行。因此,检查 finished 是安全的,而测试 Thread.is_alive(较新的 API,使用它!)在这种情况下是竞争条件。

提示:您可以通过在调用cancel 之后放置一个time.sleep 来验证这一点。然后它只会打印:

<_MainThread(MainThread, started 10872)>
Timer is finished

关于Python - threading.Timer 在调用 cancel() 方法后保持事件状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11083349/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com