不知你有没有遇到APScheduler定时任务部分未执行的情况,我反正是遇到了,任务随机性的不执行,一看 官网文档 ,才知道是自己的使用方法不对。

当前网上的大多数文章都只说了基本的使用方法,没说注意事项。我在这里整理一下:

1. Executor 是默认大小为10的ThreadPoolExecutor。

from apscheduler.schedulers.background import BackgroundScheduler
scheduler = BackgroundScheduler()
# This will get you a BackgroundScheduler with a MemoryJobStore named “default” 
# and a ThreadPoolExecutor named “default” with a default maximum thread count of 10.

       如果任务是CPU密集型,可以修改默认的Executor为ProcessPoolExecutor:

executors = {
    'default': ProcessPoolExecutor(5)
scheduler = BackgroundScheduler(executors=executors)

2. 任务未执行的原因

       原因1:Executor如果是默认的10个线程池,恰好10个线程都在忙,恰好又有一个任务A该执行了,由于没有空闲线程来处理,这个任务A将被抛弃。
原文:

If the execution of a job is delayed due to no threads or processes being available in the pool, the executor may skip it due to it being run too late (compared to its originally designated run time)

       原因2:如果有个任务B的执行时间是00:02,碰巧你的服务在00:00的时候宕机/重启了,等服务恢复的时候,已经过了00:02的执行时间了,那么任务B也会被抛弃。
原文:

Sometimes the scheduler may be unable to execute a scheduled job at the time it was scheduled to run. The most common case is when a job is scheduled in a persistent job store and the scheduler is shut down and restarted after the job was supposed to execute.

3. 解决方法

job_defaults = {
    'coalesce': True,
    'misfire_grace_time': None
scheduler = BackgroundScheduler(job_defaults=job_defaults) # 全局设置misfire_grace_time
scheduler.add_job(……, misfire_grace_time=None, coalesce=True) # 对单个任务设置 misfire_grace_time

       每个任务都有一个misfire_grace_time,单位:秒,默认是0秒。意思是 那些错过的任务在有条件执行时(有线程空闲出来/服务已恢复),如果还没有超过misfire_grace_time,就会被再次执行。如果misfire_grace_time=None,就是不论任务错过了多长时间,都会再次执行。
原文:

misfire_grace_time: seconds after the designated runtime that the job is still allowed to be run (or None to allow the job to run no matter how late it is)

       如果有个任务C是每2分钟执行一次的周期性任务,且设置了较长misfire_grace_time ,结果服务停了10分钟,10分钟后服务恢复,那么错过的5个任务C都会执行。这种情况下,如果你只想执行1个任务C,可以设置coalesce = True。

When this happens, the job is considered to have “misfired”. The scheduler will then check each missed execution time against the job’s misfire_grace_time option (which can be set on per-job basis or globally in the scheduler) to see if the execution should still be triggered. This can lead into the job being executed several times in succession.

If this behavior is undesirable for your particular use case, it is possible to use coalescing to roll all these missed executions into one. In other words, if coalescing is enabled for the job and the scheduler sees one or more queued executions for the job, it will only trigger it once. No misfire events will be sent for the “bypassed” runs.

       不知你有没有遇到APScheduler定时任务部分未执行的情况,我反正是遇到了,任务随机性的不执行,一看官网文档,才知道是自己的使用方法不对。       当前网上的大多数文章都只说了基本的使用方法,没说注意事项。我在这里整理一下:1. Executor 是默认大小为10的ThreadPoolExecutor。原文:from apscheduler.schedulers.background import
1. 定义全局变量scheduler import apscheduler.scheduler.background import BackgroundScheduler scheduler = BackgroundScheduler() scheduler.start() 2. 问题 2.1 在定时任务正常执行过程中,如果服务挂掉了,下次再次启动时,前面next_run_time时间点执行的任务不会被执行了,更新next_run_time为当前最新执行的时间 def scheduler_tas
flask项目使用flask_apscheduler运行定时任务,直接运行可以执行定时任务,但是通过uwsgi部署到服务器后任务不执行。 首先在uwsgi.ini中添加 enable-threads = true 然后值得注意的是,不要将以下代码写到if name == 'main’中: scheduler = APScheduler() scheduler.init_app(app) scheduler.start() 应当将任务的注册放到入口外面,仅将app.run()放到入口里
文章目录使用@Scheduled出现的问题 使用@Scheduled出现的问题 公司线上的一个项目,用户偶尔反馈App上部分功能没有数据,运营也是紧急联系我们技术,我经过排查发现app没有数据的功能,都是通过@Scheduled任务执行放入缓存的,但是又排查下来发现也并不是所有的定时任务没有执行,只是部分定时任务没有执行,由于情况紧急只能叫运维重启线上定时任务服务 由于问题出现的断断续续,且一般偶尔周末发生,断断续续的花了几个月时间才完全解决 在view文件中定义自己的任务,然后runserver 报错:django.db.utils.NotSupportedError: FOR UPDATE OF is not supported on this database backend. 分析:从现象看是定时模块内部代码调用数据库包导致报错,定时任务模块内部有model需要migrate创建对应的数据表,并能记录任务信息(sqlite上成功过)。未找到解决原因。
本文旨在简介dbms_scheduler的用法,包括创建带参数的任务、任务状态查看、日志查看等,看完掌握日常用法,更深入的研究建议看官方文档。 1、前提:job_queue_processes参数 根据官档的描述,该参数用来:设定每个实例、用来执行job的最大子进程数,该限制对dbms_job和dbms_scheduler的共享。 1. 为0时,job不自动执行;但可以手动执行。 2....
python打包exe报错:Fatal error: PyInstaller does not include a pre-compiled bootloader for your platform.
嘟嘟 嘟嘟嘟: 看这个 https://apscheduler.readthedocs.io/en/3.x/faq.html 。How do I share a single job store among one or more worker processes? 多个进程 共享一个job store也会出现这个问题,比如 django uwsgi 这些都是多进程的,我也是在后来发现:(django项目)还是会出现不执行的问题,我还没来得及更新这篇文章。后来我们放弃了apscheduler。就在上面那个问题下面,官方建议的解决方案是用RPC调用的方式,你可以试试看 APScheduler定时任务不执行? 芒果精呀~: 我按你的都加了 还是随机性的不执行,特别是项目运行几天之后,执行频率越来越低