程序定时任务(Python & Linux)

定时任务

定时任务的需求,在爬虫、日报以及更新活动等;需要在规定时间点或者时间周期完成的工作时是比较常见的,

Python

Python 实现定时任务的功能可以通过第三方库或者使用简易的 time 来实现;

第一种定时任务 (第三方库)

import schedule
import time
import threading


def job():
    print("I'm working... in job start")
    time.sleep(15)
    print("I'm working... in job end")


def job2():
    print("I'm working... in job2")


def run_threaded(job_func):
    job_thread = threading.Thread(target=job_func)
    job_thread.start()


schedule.every().wednesday.at("10:00").do(run_threaded, job)
schedule.every().weeks.friday.at("10:00").do(run_threaded, job2)
schedule.every().weeks.thursday.at("00:29").do(run_threaded, job)

while True:
    schedule.run_pending()
    time.sleep(1)

参数介绍 every(5) 代表数量 5,之后的 选择为单位;do 里面传入的第一个是任务函数,之后为函数需要的参数;
如:schedule.every().wednesday.at("10:00").do(run_threaded, job) 代表每周三上午十点执行 run_threaded 函数任务

第二种方法 (自定义 类)

这个方法是借鉴网上的,地址:传送门

from threading import Timer
from datetime import datetime


class MyTimer(object):

    def __init__(self, start_time, interval, callback_proc, args=None, kwargs=None):
        self.__timer = None
        self.__start_time = start_time
        self.__interval = interval
        self.__callback_pro = callback_proc
        self.__args = args if args is not None else []
        self.__kwargs = kwargs if kwargs is not None else {}

    def exec_callback(self, args=None, kwargs=None):
        self.__callback_pro(*self.__args, **self.__kwargs)
        self.__timer = Timer(self.__interval, self.exec_callback)
        self.__timer.start()

    def start(self):
        interval = self.__interval - (datetime.now().timestamp() - self.__start_time.timestamp())
        print(interval)
        self.__timer = Timer(interval, self.exec_callback)
        self.__timer.start()

    def cancel(self):
        self.__timer.cancel()
        self.__timer = None


class AA:
    def hello(self, name, age):
        print("[%s]\thello %s: %d\n" % (datetime.now().strftime("%Y%m%d %H:%M:%S"), name, age))


if __name__ == "__main__":
    aa = AA()
    start = datetime.now().replace(minute=3, second=0, microsecond=0)
    tmr = MyTimer(start, 60 * 60 * 24, aa.hello, ["owenliu", 18])
    tmr.start()

第三种 time (原始等待)

这种方法的等待是最不稳定的容易出现误差导致效果不理想
代码:time.sleep(40) ;等待 40 秒

Linux

Crontab

通过编辑定时任务文本实现,编辑命令:crontab -e
使用命令后就需要一行一行写入定时执行的任务,规则如下:

0 * * * * /bin/bash /home/your/script.sh
参数有五个:分钟、 小时、 日、 周、 月;
若分钟参数为 30 其他参数为 * 则代表 每逢 半点 时即可执行一次任务;
 若分钟参数为 */30 其他参数为 * 则代表 每 30分钟 执行一次任务。
 依次类推其他参数同理

总结

所有的定时任务各有各的好处,大家可以选择适合自己的,不过个人还是喜欢用 Linux 的定时任务。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

渊季

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值