首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Ap调度器正在跳过我的任务。如何消除这个问题?

Ap调度器正在跳过我的任务。如何消除这个问题?
EN

Stack Overflow用户
提问于 2022-08-13 11:29:40
回答 1查看 349关注 0票数 0

我想在python中安排2项任务。

第一个任务periodic_exctract_urls运行良好

但是第二个任务periodic_check_urls打印

代码语言:javascript
运行
复制
Execution of job "periodic_check_urls (trigger: interval[0:05:00], next run at: 2022-08-12 01:34:46 MSK)" skipped: maximum number of running instances reached (1)
Execution of job "periodic_check_urls (trigger: interval[0:05:00], next run at: 2022-08-12 01:39:46 MSK)" skipped: maximum number of running instances reached (1)
Execution of job "periodic_check_urls (trigger: interval[0:05:00], next run at: 2022-08-12 01:44:46 MSK)" skipped: maximum number of running instances reached (1)

我不希望这个任务被跳过。我想用每5分钟一次的新任务来代替现有的任务。我试过replace_existing=True,但没什么用。如何避免任务跳过?

我是否真正理解了两个任务(periodic_exctract_urls和periodic_check_urls)是并行工作的?

我的代码:

代码语言:javascript
运行
复制
from apscheduler.schedulers.background import BackgroundScheduler
import datetime

def schedule_task():
    scheduler = BackgroundScheduler()
    first_run_time = datetime.datetime.now() + datetime.timedelta(seconds=60)

    scheduler.add_job( # works OK
        periodic_exctract_urls,
        'interval',
        minutes=15,
        next_run_time=first_run_time
    )
    scheduler.add_job(periodic_check_urls, 'interval', minutes=5, replace_existing=True)
    scheduler.start()
EN

回答 1

Stack Overflow用户

发布于 2022-08-16 18:29:17

最新答覆(工作)- 08-18-2022

如前所述,我无法在另一个答案中获得@DialFrost建议,而使用Python 3.9APScheduler版本的3.9.x3.8.x3.7.x3.6.x3.5.x

我决定看一下APScheduler 4.0.01a,它已经完全重新设计了。BackgroundSchedulerBlockingScheduler在这个新版本中都被删除了。

这里是Scheduler的工作代码:

代码语言:javascript
运行
复制
from datetime import datetime
from apscheduler.schedulers.sync import Scheduler
from apscheduler.triggers.interval import IntervalTrigger


first_run_time = datetime.now()


def periodic_extract_urls():
    print(f'Extraction time: {datetime.now()}')
    print(datetime.now() - first_run_time)
    print('\n')


def periodic_check_urls():
    print(f'Checking time: {datetime.now()}')
    print(datetime.now() - first_run_time)
    print('\n')


with Scheduler() as scheduler:
    scheduler.add_schedule(func_or_task_id=periodic_extract_urls,
                           trigger=IntervalTrigger(minutes=15),
                           id="extract_urls")

    scheduler.add_schedule(func_or_task_id=periodic_check_urls,
                           trigger=IntervalTrigger(minutes=5),
                           id="check_urls"
                           )

    scheduler.wait_until_stopped()

这将产生以下结果:

代码语言:javascript
运行
复制
Extraction time: 2022-08-18 09:03:31.797858
0:00:00.009066


Checking time: 2022-08-18 09:03:31.797992
0:00:00.009181


Checking time: 2022-08-18 09:08:31.799883
0:05:00.011096

您还可以在AsyncScheduler中使用APScheduler 4.0.01a

代码语言:javascript
运行
复制
from asyncio import run
from datetime import datetime, timedelta
from apscheduler.schedulers.async_ import AsyncScheduler
from apscheduler.triggers.interval import IntervalTrigger

first_run_time = datetime.now()


def periodic_extract_urls():
    print(f'Extraction time: {datetime.now()}')
    print(datetime.now() - first_run_time)
    print('\n')


def periodic_check_urls():
    print(f'Checking time: {datetime.now()}')
    print(datetime.now() - first_run_time)
    print('\n')


async def jobs():
    async with AsyncScheduler() as scheduler:
        await scheduler.add_schedule(func_or_task_id=periodic_extract_urls,
                                     trigger=IntervalTrigger(minutes=15, start_time=first_run_time),
                                     id="extract_urls"
                                     )

        await scheduler.add_schedule(func_or_task_id=periodic_check_urls,
                                     trigger=IntervalTrigger(minutes=5,
                                                             start_time=first_run_time + timedelta(seconds=300)),
                                     id="check_urls"
                                     )

        await scheduler.wait_until_stopped()


run(jobs())

这是输出:

代码语言:javascript
运行
复制
Extraction time: 2022-08-18 12:03:54.617456
0:00:00.015132


Checking time: 2022-08-18 12:08:54.615003
0:05:00.012665


Checking time: 2022-08-18 12:13:54.616444
0:10:00.014104

最新答覆- 08-17-2022

我一直试图让misfire_grace_time使用Python 3.9APScheduler版本的3.9.x3.8.x3.7.x3.6.x3.5.x

我还尝试使用coalescemax_instances来解决BackgroundScheduler问题。到目前为止,什么都没有起作用,新的错误也出现了。

我看了APScheduler的问题。我注意到,这个与BackgroundScheduler有关的问题是在2018年提出的,并在4.0.1a中得到了解决,并基于已发布的4.x注释(在alpha BackgroundScheduler中)正在被替换。

间隔很短的重复作业会在关机时触发异常。

我仍然建议将BlockingScheduler 用作 interval cron**.**

以下是我对BlockingSchedulercron的使用的旧答案之一

下面是我目前正在用Python 3.9APScheduler版本3.9.x3.8.x3.7.x3.6.x3.5.x测试的代码。

代码语言:javascript
运行
复制
from datetime import datetime, timedelta
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.executors.pool import ThreadPoolExecutor, ProcessPoolExecutor

executors = {
        'default': ThreadPoolExecutor(20),
        'processpool': ProcessPoolExecutor(5)
    }
# 15*60
jobDefaults = {
        'coalesce': True,
        'max_instances': 100,
        'misfire_grace_time': 15*60
    }

scheduler = BackgroundScheduler(daemon=False, executors=executors, job_defaults=jobDefaults, timezone='UTC')
first_run_time = datetime.now()


def periodic_extract_urls():
    print(f'Extraction time: {datetime.now()}')
    print(datetime.now() - first_run_time)


def periodic_check_urls():
    print(f'Checking time: {datetime.now()}')
    print(datetime.now() - first_run_time)


def schedule_task():
    print(f'Start time: {first_run_time}')

    scheduler.add_job(func=periodic_extract_urls,
                      id="extract_urls",
                      trigger='interval',
                      minute=15,
                      next_run_time=first_run_time,
                      replace_existing=True,
                      )

    scheduler.add_job(func=periodic_check_urls,
                      id="check_urls",
                      trigger='interval',
                      minute=5,
                      next_run_time=datetime.now() + timedelta(seconds=300),
                      replace_existing=True,
                      )

    try:
        scheduler.start()
        print(scheduler.print_jobs())
    except (KeyboardInterrupt, SystemExit):
        print("shutdown scheduler")
        scheduler.shutdown()


schedule_task()

原答覆- 08-16-2022

我仍在努力使BackgroundScheduler正常工作。我使用的是Python 3.9,它要求我修改apscheduler util.py,它为Python 3.9提供了一个不兼容的时区函数。

我能用BlockingScheduler得到一些有用的东西

代码语言:javascript
运行
复制
import logging
import datetime
from apscheduler.schedulers.blocking import BlockingScheduler

def periodic_extract_urls():
    print(f'Extraction time: { datetime.datetime.now()}')
    print(datetime.datetime.now() - first_run_time)

def periodic_check_urls():
    print(f'Checking time: {datetime.datetime.now()}')
    print(datetime.datetime.now() - first_run_time)

def schedule_task():
    print(f'Start time: {first_run_time}')

     scheduler.add_job(
        periodic_extract_urls, 
        'interval', 
        minutes=15, 
        next_run_time=first_run_time
    )
    
    scheduler.add_job(
        periodic_check_urls, 
        'interval', 
        minutes=5, 
        replace_existing=True,
        next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=300)
    )

    scheduler.start()

# run function
schedule_task()

此代码输出如下:

代码语言:javascript
运行
复制
Start time: 2022-08-16 15:19:12.727035
Extraction time: 2022-08-16 15:19:12.786244
0:00:00.059298
Checking time: 2022-08-16 15:24:12.796427
0:05:00.069420
Checking time: 2022-08-16 15:29:12.796830
0:10:00.069823
Extraction time: 2022-08-16 15:34:12.737923
0:15:00.010918
Checking time: 2022-08-16 15:34:12.790511
0:15:00.063520
Checking time: 2022-08-16 15:39:12.796448
0:20:00.069444
代码语言:javascript
运行
复制
----------------------------------------
My system information
----------------------------------------
Platform:               macOS
Python:                 3.9.0
apscheduler:            3.9.1
----------------------------------------
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73343854

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档