当作业同时设置为 运行 时,APScheduler 作业数次 运行
APScheduler jobs run several times when jobs are set to be run at the same time
我想使用 APScheduler 和 cron format 安排 运行 作业。
from apscheduler.schedulers.background import BackgroundScheduler
def test_func():
print("Test job func")
scheduler = BackgroundScheduler()
today_str = datetime.today().strftime('%Y-%m-%d')
today_with_time = datetime.strptime(today_str + " " + "12:07:00", "%Y-%m-%d %H:%M:%S")
scheduler.add_job(
test_func,
"cron",
id="test",
name="test",
day_of_week="2",
hour=today_with_time.hour,
minute=today_with_time.minute,
replace_existing=False)
假设我使用两个不同的作业 ID 执行了两次。有两个作业,同时设置为 运行。对于一份工作,它 运行 如预期的那样。有了两份工作,它 运行s 4 倍。其他触发器(例如 DateTrigger)也会发生同样的情况。
请注意,这是在 Flask 应用程序中设置的。通常,该应用会调用另一个 API 来获取作业,然后一个接一个地安排它们。
编辑:我的实际应用同时获取 3 个作业并安排它们。当我获取 1 个作业而不是 3 个作业时,错误不会发生。当我有 3 个工作时,函数是 运行 9 次。有 1 个工作,它是 运行 一次。
这是因为 Flask 在调试模式下初始化了两次。
简答:app.run(调试=真,use_reloader=假)
完整答案在这里:How to stop Flask from initialising twice in Debug Mode?
原来我是个天才,每次获取作业时都初始化了一个调度程序。 :-]
所以现在,我将管理调度(并初始化调度程序)的 class 更改为单例,它按预期工作。
我遇到了类似的问题,因为在我的情况下,每当我向它添加新作业时我都会初始化调度程序。
解决方案:
create separate function or class, which initialize/call only once and use the
scheduler object wherever you are using job operations eg: add, pause, resume etc
代码片段:
def initialize_scheduler():
sched = BackgroundScheduler(daemon=False)
job_store = MongoDBJobStore(database=db.name,
collection='scheduler', client=client,
pickle_protocol=4)
sched.add_jobstore(jobstore=job_store, alias='mongodb')
sched.start()
return sched
上述 sched
变量将在任何地方使用。
我想使用 APScheduler 和 cron format 安排 运行 作业。
from apscheduler.schedulers.background import BackgroundScheduler
def test_func():
print("Test job func")
scheduler = BackgroundScheduler()
today_str = datetime.today().strftime('%Y-%m-%d')
today_with_time = datetime.strptime(today_str + " " + "12:07:00", "%Y-%m-%d %H:%M:%S")
scheduler.add_job(
test_func,
"cron",
id="test",
name="test",
day_of_week="2",
hour=today_with_time.hour,
minute=today_with_time.minute,
replace_existing=False)
假设我使用两个不同的作业 ID 执行了两次。有两个作业,同时设置为 运行。对于一份工作,它 运行 如预期的那样。有了两份工作,它 运行s 4 倍。其他触发器(例如 DateTrigger)也会发生同样的情况。
请注意,这是在 Flask 应用程序中设置的。通常,该应用会调用另一个 API 来获取作业,然后一个接一个地安排它们。
编辑:我的实际应用同时获取 3 个作业并安排它们。当我获取 1 个作业而不是 3 个作业时,错误不会发生。当我有 3 个工作时,函数是 运行 9 次。有 1 个工作,它是 运行 一次。
这是因为 Flask 在调试模式下初始化了两次。
简答:app.run(调试=真,use_reloader=假)
完整答案在这里:How to stop Flask from initialising twice in Debug Mode?
原来我是个天才,每次获取作业时都初始化了一个调度程序。 :-]
所以现在,我将管理调度(并初始化调度程序)的 class 更改为单例,它按预期工作。
我遇到了类似的问题,因为在我的情况下,每当我向它添加新作业时我都会初始化调度程序。
解决方案:
create separate function or class, which initialize/call only once and use the scheduler object wherever you are using job operations eg: add, pause, resume etc
代码片段:
def initialize_scheduler():
sched = BackgroundScheduler(daemon=False)
job_store = MongoDBJobStore(database=db.name,
collection='scheduler', client=client,
pickle_protocol=4)
sched.add_jobstore(jobstore=job_store, alias='mongodb')
sched.start()
return sched
上述 sched
变量将在任何地方使用。