Apscheduler 开箱即用代码样例

1.BackgroundScheduler

 


from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background  import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
import time


def start():
    executors = {
        # 默认使用进程池
        'default': ProcessPoolExecutor(10)
    }
    job_defaults = {
        # 是否开启作业合并
        'coalesce': True,
        # 最大执行作业数100(生产环境下建议调高,否则按需调整即可)
        'max_instances': 100,
        # 检查每个错过的执行时间,以查看是否仍应触发执行
        'misfire_grace_time': 60
    }
    # 使用BackgroundScheduler 调度(后台挂起,非阻塞)
    # 在内置作业存储中,只有 MemoryJobStore 不序列化作业。在内置执行器中,只有 ProcessPoolExecutor 会序列化作业
    # BackgroundScheduler:当您不使用以下任何框架并希望调度程序在应用程序的后台运行时使用
    scheduler = BackgroundScheduler(executors = executors, job_defaults = job_defaults)
    # add_job(需要执行的函数,定时器类型,间隔时间,作业id,是否替换作业id)
    scheduler.add_job(方法1, 'interval', minutes = 5, id = 'Timer_tasks',replace_existing=True)
    scheduler.add_job(方法2, 'interval', hours = 1, id = 'Timer_details',replace_existing=True)
    scheduler.add_job(方法3, 'interval', hours = 4, id = 'Timer_comments',replace_existing=True)
    scheduler.start()
    
    # 主进程需要持续运行,BackgroundScheduler 才会运行生效
    while (True):
        time.sleep(1)


if __name__ == '__main__':
    start()

 

 

 

 

2.BlockingScheduler

from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.schedulers.background  import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor
import time

loggings = Loggings()


def start():
    executors = {
        'default': ProcessPoolExecutor(10)
    }
    job_defaults = {
        'coalesce': True,
        'max_instances': 100,
        'misfire_grace_time': 60
    }
    # BlockingScheduler 是会阻塞的
    # BlockingScheduler:当调度程序是您的进程中唯一运行的东西时使用
    scheduler = BlockingScheduler(executors = executors, job_defaults = job_defaults)
    scheduler.add_job(方法1, 'interval', minutes = 5, id = 'Timer_tasks',replace_existing=True)
    scheduler.add_job(方法2, 'interval', hours = 1, id = 'Timer_details',replace_existing=True)
    scheduler.add_job(方法3, 'interval', hours = 4, id = 'Timer_comments',replace_existing=True)
    scheduler.start()


if __name__ == '__main__':
    start()

 

上面的代码应该可以满足一些简单的日常使用,如需扩展,没有什么是官方文档更好的了。(不要看某些垃圾文章,简直浪费时间,至于某些问题我已经浪费了一周时间)

某些文章直接抄官方文档,且!他妈的抄都抄不全!

官方链接

 

接下来贴一个经过我找了很多的文章找到的一个问题。

 

 如果开启了作业合并,并且加大了作业运行量和替换作业id的机制,还存在类似这样的错误,经过个人经验判断如下:

1.执行作业中,假如定时为1个小时1次,那么这个任务是否能在一个小时执行完毕?如果不能,加大定时间隔,如果能,转下一条

2.如果这样的问题发生在服务器上,那么在本地也开启同样的服务进行对比,如果本地也出现这样的问题,建议排查作业相关的代码,是否出现影响下次作业执行的代码段,如果服务器出现,转下一条

3.服务器上先判断代码是否能成功启动,需要导入的包和环境是否异常,如果都没问题,需要查看2点

  • 当前系统负载

  • 当前运行作业数量

 

如果上面排查的都没啥问题,大概率是系统负载导致的

 

 

更换服务器节点或者环境即可。

posted @ 2022-01-20 11:32  黑山老道  阅读(87)  评论(0编辑  收藏  举报