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