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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值