10s后执行,单次
from threading import Timer
def hello(name, string):
print(f"hello : {name} ,nice to : {string}")
t = Timer(10, hello, ("怎料事与愿违", "不愿染是与非"))
t.start()
循环定时器:在 function 里继续注册一个 Timer,这样就可以在下一个 interval 继续执行 function
from threading import Timer
def hello(name, string):
print(f"hello : {name} ,nice to : {string}")
Timer(10, hello, ("怎料事与愿违", "不愿染是与非")).start()
t = Timer(10, hello, ("怎料事与愿违", "不愿染是与非"))
t.start()
但每次循环,系统都要创建一个线程,然后再回收,interval小时开销很大,不提倡在 function 里继续注册一个 Timer
重写run()方法
from threading import Timer
class RepeatingTimer(Timer):
def run(self):
while not self.finished.is_set():
self.function(*self.args, **self.kwargs)
self.finished.wait(self.interval)
class UseTimer:
def __init__(self, interval, function_name, *args, **kwargs):
"""
:param interval:时间间隔
:param function_name:可调用的对象
:param args:args和kwargs作为function_name的参数
"""
self.timer = RepeatingTimer(interval, function_name, *args, **kwargs)
def timer_start(self):
self.timer.start()
def timer_cancle(self):
self.timer.cancel()
#自测代码
if __name__ == '__main__':
from time import sleep
def hello(name, string):
print(f"hello : {name} ,nice to : {string}")
t = UseTimer(10, hello, ("怎料事与愿违", "不愿染是与非"))
t.timer_start()
sleep(10)
t.timer_cancle()
测试用例中调用:
if __name__ == '__main__':
# unittest.main(verbosity=2)
test_suit = unittest.TestSuite()
t = UseTimer(1000, TestClueStatus.test_clue_status).timer_start()
test_suit.addTest(t)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(test_suit)
完整代码:
import unittest
import ddt
from datetime import datetime
from leadscloud_util.Timer import UseTimer
from leadscloud_configuration import ConnectMysql
from leadscloud_sql import sql_csm_clue_status
def get_common_data():
"""
获取公共数据org_id,date,manager_id,方便函数调用实现数据驱动
:return:
"""
db = ConnectMysql.test_cur #实例化
search_data = sql_csm_clue_status.common_data #获取sql语句
common_data = db.select_data_from_table("report", search_data) #获取执行sql的结果
return common_data
@ddt.ddt
class TestClueStatus(unittest.TestCase):
@classmethod
def setUpClass(cls) -> None:
cls.db1 = ConnectMysql.test_cur #连接测试数据库
# cls.cur2 = ConnectMysql.copy_cur #连接线上备份库
# cls.cur3 = ConnectMysql.bi_cur #连接Bi库
@classmethod
def tearDownClass(cls) -> None:
cls.db1.close_database()
def setUp(self) -> None:
pass
def tearDown(self) -> None:
pass
@ddt.data(* get_common_data())
def test_clue_status(self, commondata):
org_id, date, manager_id = commondata #对获得的数据进行解包, 分别为int、date、str类型
b = datetime.strftime(date, '%Y-%m-%d') #将日期转换为字符串类型
bi_search_data = sql_csm_clue_status.ClueStatus(str(org_id), b, manager_id).bi_clue_status() #获取查询bi库的sql
bi_result = self.db1.select_data_from_table("bi", bi_search_data) # 调用检索数据的函数,返回元组
report_search_data = sql_csm_clue_status.ClueStatus(str(org_id), b, manager_id).report_clue_status()
report_result = self.db1.select_data_from_table("report", report_search_data)
# t = UseTimer(10, self.test_clue_status(commondata))
# t.timer_start()
try:
self.assertTupleEqual(bi_result, report_result)
except AssertionError as e:
raise e
if __name__ == '__main__':
# unittest.main(verbosity=2)
test_suit = unittest.TestSuite()
t = UseTimer(1000, TestClueStatus.test_clue_status).timer_start()
test_suit.addTest(t)
runner = unittest.TextTestRunner(verbosity=2)
runner.run(test_suit)
原文链接:https://blog.csdn.net/qq_41969287/article/details/106457494