我想在python中安排2项任务。
第一个任务periodic_exctract_urls
运行良好
但是第二个任务periodic_check_urls
打印
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)是并行工作的?
我的代码:
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()
发布于 2022-08-16 18:29:17
最新答覆(工作)- 08-18-2022
如前所述,我无法在另一个答案中获得@DialFrost建议,而使用Python 3.9
和APScheduler
版本的3.9.x
、3.8.x
、3.7.x
、3.6.x
和3.5.x
。
我决定看一下APScheduler
4.0.01a,它已经完全重新设计了。BackgroundScheduler
和BlockingScheduler
在这个新版本中都被删除了。
这里是Scheduler的工作代码:
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()
这将产生以下结果:
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
。
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())
这是输出:
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.9
和APScheduler
版本的3.9.x
、3.8.x
、3.7.x
、3.6.x
和3.5.x
。
我还尝试使用coalesce
和max_instances
来解决BackgroundScheduler
问题。到目前为止,什么都没有起作用,新的错误也出现了。
我看了APScheduler
的问题。我注意到,这个与BackgroundScheduler有关的问题是在2018年提出的,并在4.0.1a
中得到了解决,并基于已发布的4.x注释(在alpha BackgroundScheduler
中)正在被替换。
我仍然建议将BlockingScheduler
用作 interval
或 cron
**.**
以下是我对BlockingScheduler
与cron的使用的旧答案之一
下面是我目前正在用Python 3.9
和APScheduler
版本3.9.x
、3.8.x
、3.7.x
、3.6.x
和3.5.x
测试的代码。
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
得到一些有用的东西
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()
此代码输出如下:
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
----------------------------------------
My system information
----------------------------------------
Platform: macOS
Python: 3.9.0
apscheduler: 3.9.1
----------------------------------------
https://stackoverflow.com/questions/73343854
复制相似问题