python timer 不循环_python定时器Timer,循环执行

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值