【发布时间】:2019-04-02 20:28:01
【问题描述】:
我无法完全拼凑出如何访问 apscheduler 中计划作业的返回值。作业需要每天在不同的时间运行,我需要今天作业的返回值来安排明天的作业。
此链接 (how to get return value from apscheduler jobs) 似乎是此问题的最佳先前答案。它建议向调度程序添加一个侦听器。我添加了一个监听器,但我不确定如何访问它的返回值。我可以访问附加到调度程序的侦听器,但无法访问它们的输出。下面代码中的监听器 job_runs() 将在计划作业运行时打印。
此外,我知道我需要访问一个保存函数返回值的 JobExecutionEvent (https://apscheduler.readthedocs.io/en/latest/modules/events.html#module-apscheduler.events)。
首先,我要访问的函数是 run_all(),其中执行了一堆操作,但我只为测试用例返回 True。
from apscheduler.schedulers.background import BackgroundScheduler
from apscheduler.schedulers.blocking import BlockingScheduler
from apscheduler.events import EVENT_JOB_EXECUTED, EVENT_JOB_ERROR, JobExecutionEvent
from datetime import datetime, timedelta
import logging
def run_all():
return True
def job_runs(event): # listener function
if event.exception:
print('The job did not run')
else:
print('The job completed @ {}'.format(datetime.now()))
def job_return_val(event): # listener function
return event.retval
然后,我设置调度程序、添加侦听器并添加作业。触发器设置为在作业添加到调度程序后 1 分钟运行函数。
scheduler = BackgroundScheduler()
scheduler.add_listener(job_runs, EVENT_JOB_EXECUTED | EVENT_JOB_ERROR)
scheduler.add_listener(job_return_val, EVENT_JOB_EXECUTED)
cron_args = datetime_to_dict(datetime.now() + timedelta(minutes=1))
job = scheduler.add_job(run_all, "cron", **cron_args)
接下来,我启动调度程序并打印调度的作业。此外,我设置了日志记录,因此我知道调度程序在哪里。
test = scheduler.start()
scheduler.print_jobs()
logging.basicConfig()
logging.getLogger('apscheduler').setLevel(logging.DEBUG)
启用日志记录后,调度程序会报告作业已运行并从调度程序中删除,正如我所期望的那样。 job_runs() 将正确的输出打印到控制台。通过断点,我知道调用了 job_return_val()。但是,我不知道它返回的值被发送到哪里。该函数似乎在名为 APScheduler 的不同线程中调用。我对线程了解不多,但这是有道理的。但是,我不明白该线程的输出何时返回到主线程。
最后,我尝试使用可从调度程序和作业的属性访问的代码、job_id、jobstore 和 schedule_run_time 实例化 JobExceptionEvent,但 JobExceptionEvent 似乎不知道该事件是在调度程序中运行的。由于前一段中描述的线程,这似乎也很有意义。
对整理此问题有任何帮助!
【问题讨论】:
标签: python apscheduler