Python 定时计划任务
第一种 sleep 睡眠线程
import time
# 每n 秒执行一次
def timer(n):
while True:
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
time.sleep(n)
第二种 threading模块中的Timer
from threading import Timer
def printTime(inc):
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
t = Timer(inc, printTime, (inc,))
t.start()
threading 模块中的 Timer 是一个非阻塞函数,比 sleep 稍好一点
Timer 函数第一个参数是时间间隔(单位是秒),第二个参数是要调用的函数名,第三个参数是调用函数的参数(tuple)
相当于内循环自己调用自己
第三种 APscheduler 定时框架 基于系统内存
直接使用包里的cron方法
from apscheduler.schedulers.blocking import BlockingScheduler
from datetime import datetime
from apscheduler.triggers.cron import CronTrigger
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# BlockingScheduler
scheduler = BlockingScheduler()
# 调用封装的crontab时间创建方法
# 但是实际上这种方法只提供了5个参数,最细只能到分,有些场景下达不到我们的要求,
# 需要重新creontab时间创建方法
scheduler.add_job(job, CronTrigger.from_crontab('* * * * * '))
scheduler.start()
重写cron方法,支持更多的参数
# 重写crontab时间创建方法
# 重写Cron定时 提供7个参数进行处理
class my_CronTrigger(CronTrigger):
@classmethod
def my_from_crontab(cls, expr, timezone=None):
values = expr.split()
if len(values) != 7:
raise ValueError('Wrong number of fields; got {}, expected 7'.format(len(values)))
return cls(second=values[0], minute=values[1], hour=values[2], day=values[3], month=values[4],
day_of_week=values[5], year=values[6], timezone=timezone)
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# BlockingScheduler
scheduler = BlockingScheduler()
# 这样就可以达到每秒执行
scheduler.add_job(job, my_CronTrigger.my_from_crontab('* * * * * * *'))
# 如果调用的方法需要传参可以这样写
# scheduler.add_job(job1, 'interval', seconds=20,args=['para1','para2','para3'])
# scheduler.add_job(job2, 'interval', seconds=20,kwargs={'para1':'3','para2':'2','para3':'1'})
scheduler.start() # 这里start的时候,会按照cron时间配置进行阻塞,表示进程工作,不会执行到下一句代码
# 可以考虑使用异步线程启动这个方法,把事情交给内存去做
第四种 APscheduler 定时框架 基于mongoDB数据库
from datetime import datetime
from pymongo import MongoClient
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.jobstores.memory import MemoryJobStore
from apscheduler.jobstores.mongodb import MongoDBJobStore
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
# MongoDB 参数
host = '127.0.0.1'
port = 27017
client = MongoClient(host, port)
# 输出时间
def job():
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
# 存储方式
jobstores = {
'mongo': MongoDBJobStore(collection='job', database='test', client=client),
'default': MemoryJobStore()
}
executors = {
'default': ThreadPoolExecutor(10),
'processpool': ProcessPoolExecutor(3)
}
job_defaults = {
'coalesce': False,
'max_instances': 3
}
scheduler = BlockingScheduler(jobstores=jobstores, executors=executors, job_defaults=job_defaults)
scheduler.add_job(job, 'interval', seconds=5, jobstore='mongo')
scheduler.start() # 这里start的时候,会按照cron时间配置进行阻塞,表示进程工作,不会执行到下一句代码
# 可以考虑使用异步线程启动这个方法,把事情交给内存去做
推荐这篇文章,写的很详细 https://www.cnblogs.com/fengff/p/11011000.html
惜秦皇汉武,略输文采;唐宗宋祖,稍逊风骚。
一代天骄,成吉思汗,只识弯弓射大雕。
俱往矣,数风流人物,还看今朝