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

posted @ 2021-09-16 18:01  darling331  阅读(211)  评论(0编辑  收藏  举报