如何解释 APScheduler 中从 get_jobs 返回的作业列表?

How to interpret list of jobs returned from get_jobs in APScheduler?

我想弄清楚 APScheduler 是否是满足我项目需求的工具。

我可以加个工作。

我可以获得工作列表 -- 但我无法解释结果。我想让我的程序将这个返回的作业列表翻译成程序其他部分需要的格式。我需要提取触发参数。

假设我正在使用 cron 触发器。我先做一个简单的:

new_job = self.scheduler.add_job(jobfunc,'cron', minute='*/5', args=["minute"]

稍后,我想获取作业,然后提取基本信息(这是一个 cron 触发器,它被安排在 'minute'=*/5)——基本上我想重构参数我用它创建了触发器。

我查看了调试器中返回的作业,我看到每个作业都有一个“触发器”成员,其中包含我需要的信息 -- 但我不确定如何以编程方式访问它。

我想做这样的事情:

    jobs=self.scheduler.get_jobs()
    schedules=[]
    for job in jobs:
        schedules.append(<do something with job.trigger.fields>)

附加到日程表的元素看起来像这样:

{'minute':'*/5'}

文档说:

To get a machine processable list of the scheduled jobs, you can use the get_jobs().

问题是,我的 'machine' 应该如何处理这个列表?

好的,感谢之前在 APScheduler Google 组上提出的问题,我有一个解决方案!

细节必须通过字段访问,正如我所想的。从单个字段中获取信息的关键是将字段值转换为字符串。

这是一个有效的例子:

 schedules = []
 for job in self.scheduler.get_jobs():
     jobdict = {}
     for f in job.trigger.fields:
         curval = str(f)
         jobdict[f.name] = curval

     schedules.append(jobdict)

对于添加了一项工作的时间表:

new_job = self.scheduler.add_job(jobfunc,'cron', second='*/5', args=["second"])

结果列表是这样的:

[{'week': '*', 'hour': '*', 'day_of_week': '*', 'month': '*', 'second': '*/5', 'year': '*', 'day': '*', 'minute': '*'}]

APScheduler .get_jobs() 方法 returns 作业实例列表。

例如,您可以打印有关所有当前计划的作业的信息,如下所示:

for job in scheduler.get_jobs():
    print("name: %s, trigger: %s, next run: %s, handler: %s" % (
          job.name, job.trigger, job.next_run_time, job.func))

请注意,作业名称可以在不同的作业中重复。

您可以在这里找到 API reference for the job class。它没有明确列出作业 class 成员,但它们匹配 kwargs.

中的变量

为任何试图找到其作业对象的不同属性的人将其放在这里。 由于该对象不使用 __dict__,因此请使用 __slots__。这将向您显示作业对象的所有不同属性,就像 __dict__ 一样。

>>> scheduler.get_jobs()[0].__slots__
('_scheduler', '_jobstore_alias', 'id', 'trigger', 'executor', 'func', 'func_ref', 'args', 'kwargs', 'name', 'misfire_grace_time', 'coalesce', 'max_instances', 'next_run_time', '__weakref__')

然后使用此信息您可以检索属性

>>> scheduler.get_jobs()[0].trigger
<IntervalTrigger (interval=datetime.timedelta(seconds=1200), start_date='2021-08-06 10:01:19 CDT', timezone='America/Chicago')>
>>> scheduler.get_jobs()[0].max_instances
1