栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Python 定时线程

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Python 定时线程

threading.Timer + threading.Event

import threading
import time
import argparse

class Server:

    def __init__(self, ):
        self.screen_lock = threading.Lock()  # 屏幕打印锁,和定时任务无关
        self.exitEvent = threading.Event()  # 主线程退出信号
        self.exitEvent.clear()

    def safe_print(self,*args,**kwargs):
        try:
            self.screen_lock.acquire()
            print(*args,**kwargs)
        finally:
            self.screen_lock.release()

    def scheduled_job(self, save_path, save_interval):
        print( f"Doing scheduled job ... {time.strftime('%Y-%m-%d %H:%M:%S')}")

        # TODO: complete your job here 
        with open(save_path, 'a') as file:
            file.write('repeat doing this...n')
        
        # 如果主线程没有退出,启动下一次定时任务
        if not self.exitEvent.isSet():
            self.timer = threading.Timer(
                60*save_interval, 
                self.scheduled_job, 
                args = (save_path, save_interval)
            )
            self.timer.start()

if __name__=="__main__":  # 主线程

    parser=argparse.ArgumentParser()
    parser.add_argument('-s','--save_interval',type=float,required=False,help='Number of minutes to wait before trying to save. Default is 10 minutes.  Set to 0 to never save.',default=10)
    parser.add_argument('-f','--save_path',type=str, required=True,help='File path where to save data.')
    args = parser.parse_args()

    server = Server()

    # 第一次调度
    if args.save_interval:
        server.timer = threading.Timer(
            60 *args.save_interval, 
            server.scheduled_job, 
            args = (args.save_path, args.save_interval)
        )
        server.timer.start()
    
    while True:
        try:
            # TODO: server.handle_request()
            time.sleep(1)

        except KeyboardInterrupt:
            break

    if args.save_interval:
        server.exitEvent.set()  # 设置退出信号
        server.timer.cancel()  # 取消下一次调度
        try:  # 下一定调度提前,改成立即执行
            server.scheduled_job(args.save_path, args.save_interval)
        except:
            server.safe_print("[!] An error occured during the final save.")

    server.safe_print("Server has stopped.")

测试
>>> python testServer.py -f ./test.log -s 0.05
Doing scheduled job ... 2022-06-26 01:34:21
Doing scheduled job ... 2022-06-26 01:34:24
Doing scheduled job ... 2022-06-26 01:34:27
^CDoing scheduled job ... 2022-06-26 01:34:28
Server has stopped.

>>> cat test.log
repeat doing this...
repeat doing this...
repeat doing this...
repeat doing this...
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/994022.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号