gpt4 book ai didi

python - 如何杀死这个threading.Timer?

转载 作者:行者123 更新时间:2023-11-28 21:46:40 24 4
gpt4 key购买 nike

我已经使用 Timer 对象启动了一个线程。现在,我想停止这个线程,但我做不到。我使用了 cancel(),但它不起作用。我不知道为什么。

import threading
import time
import sys as system
def Nop():
print("do nothing")
return 0
def function():
try:
while True:
print("hello world ")
time.sleep(2)
except KeyboardInterrupt:
print( "Good job!! exception catched")
t = threading.Timer(10, function)
t.start()
print(t.getName)
counter = 0
while True:
try:
time.sleep(1)
Nop()
counter = counter +1
print(counter)
if counter == 20:
print(t.getName)
t.cancel()
counter = 0
break
if t.is_alive() == False:
print("The Timer thread is dead...")
except KeyboardInterrupt:
print("End of program")
t.cancel()
system.exit(0)
except:
print("something wrong happens...")
if t.is_alive() == True:
print("timer is alive...")
print(t.getName)
t.cancel()
print("final")
system.exit(0)

当计数器等于 20 时,线程应该停止,但它仍然存在。当我退出 while 循环时,还有另一个检查。计时器还活着,是同一个线程,我尝试取消,但它不起作用。

有什么想法吗?

do nothing
17
hello world
do nothing
18
do nothing
19
hello world do nothing

20
<bound method _Timer.getName of <_Timer(Thread-6, started daemon 9916)>>
timer is alive...
<bound method _Timer.getName of <_Timer(Thread-6, started daemon 9916)>>
final
To exit: use 'exit', 'quit', or Ctrl-D.
An exception has occurred, use %tb to see the full traceback.

SystemExit: 0

hello world
hello world
hello world
hello world

最佳答案

这里的问题可以通过阅读the documentation来解决更仔细。计时器线程的 cancel 方法“...只有在计时器仍处于等待阶段时才会起作用。”

当您调用 t.cancel 时,计时器已触发,并且其相关函数正在执行,因此它不再“处于等待阶段”,即使该函数实际上花费了它的大部分时间时间休眠 - 这并不意味着它处于等待阶段,该阶段在计时器触发时终止..

更一般地说,没有线程的积极合作,就没有办法杀死线程,如several SO answers已经总结的很好了。

与其使用 cancel,不如设置某种标志,function 会查看它以确定它是否应该终止其循环(以及整个线程)。

关于python - 如何杀死这个threading.Timer?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37565773/

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