我想使用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。有两个作业,设置为在同一时间运行。只需一份工作,就会按预期运行一次。有两个工作,它运行4次。其他触发器也是如此,例如DateTrigger。
请注意,这是在Flask应用中设置的。通常,应用程序会调用另一个API来获取作业,然后逐个安排它们。
编辑:我的实际应用程序同时获取3个作业并安排它们。当我获取1个作业而不是3个时,错误不会发生。当我有3个作业时,该功能运行9次。只需一份工作,就可以运行一次。
答案 0 :(得分:0)
这是因为Flask在调试模式下初始化两次。
简答:app.run(debug = True,use_reloader = False)
完整答案:How to stop Flask from initialising twice in Debug Mode?
答案 1 :(得分:0)
事实证明,我是一个天才,每次提取工作时都会初始化一个调度程序。 : - ]
现在,我将管理调度(并初始化调度程序)的类更改为单例,并且按预期工作。
答案 2 :(得分:0)
我遇到了类似的问题,就我而言,每当我向调度程序添加新作业时,我都会对其进行初始化。
解决方案:
<块引用>创建单独的函数或类,只初始化/调用一次并使用 无论您在何处使用作业操作,都可以使用调度程序对象,例如:添加、暂停、恢复等
代码片段:
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
var 将在任何地方使用。