【发布时间】:2019-06-04 09:58:34
【问题描述】:
我正在使用threading.Timer 包在 x 秒后执行一个方法。但是,在某些情况下,我想提前执行此方法并取消计时器(因此不会调用两次)。 我如何对此进行单元测试?
我想知道计时器是否已停止,以便不再调用该方法。我现在正在使用以下代码,不幸的是is_alive still 返回True
from threading import Timer
Class X():
def __init__(self, timeout):
self.timer = Timer(timeout, self.some_method)
self.timer.start()
def some_method(self):
# Do something
def other_method(self):
self.timer.cancel()
self.some_method()
import unittest
Class TestX(unittest.TestCase):
def test_cancel_timer(self):
x = X(1000)
x.other_method()
self.assertFalse(x.timer.is_alive())
形成文档,is_alive 方法在run 操作期间返回 True;
返回线程是否存活。 此方法在 run() 方法开始之前直到 run() 方法终止之后才返回 True。模块函数 enumerate() 返回所有活动线程的列表。
cancel 方法的文档说明如下;
停止定时器,并取消定时器动作的执行。这仅在计时器仍处于等待阶段时才有效。
这是否意味着cancel 方法不会停止run 操作?还是在run方法之后仍然处于灰色区域并因此返回True?
【问题讨论】:
-
取消操作需要一些时间(例如,应该释放计时器分配的锁等等)。如果您在
x.other_method()之后和检查x.timer.is_alive()之前添加一些暂停(例如time.sleep(.1)),则测试应该通过。 -
嗯,好吧,这似乎可行。但是当取消方法运行时,该方法永远不会被调用?例如。定时器在取消操作执行之后和取消操作完成之前正好用完。
-
一旦触发取消,该动作将不再执行;但是,请记住,计时器中两个操作之间的时间间隔不能保证与您在
Timer构造函数中传递的timeout完全相同,因此肯定有可能发生冲突。
标签: python python-multithreading python-unittest