如何使用APScheduler

时间:2016-04-18 12:01:58

标签: python scheduled-tasks scheduling apscheduler

我是APScheduler的新手 为了测试,我设置了max_worker=2并为调度程序添加了4个不同的作业。由于线程池的限制,我打算并行运行2个作业,我认为在完成某个工作后,另一个添加的工作将投入到线程池中,但下面的结果不是我预期的,它只是继续运行前2个工作。

Arg is 1, time is Mon Apr 18 19:51:33 2016
Arg is 2, time is Mon Apr 18 19:51:33 2016
No handlers could be found for logger "apscheduler.scheduler"
Arg is 1, time is Mon Apr 18 19:51:37 2016  
Arg is 2, time is Mon Apr 18 19:51:37 2016
Arg is 1, time is Mon Apr 18 19:51:41 2016
Arg is 2, time is Mon Apr 18 19:51:41 2016
Arg is 1, time is Mon Apr 18 19:51:45 2016
Arg is 2, time is Mon Apr 18 19:51:45 2016
...

以下是代码:

import time
from apscheduler.schedulers.blocking import BlockingScheduler

def job(arg):
    print 'Arg is %s, time is %s' % (arg, time.ctime())
    time.sleep(2)

if __name__ == '__main__':
    scheduler = BlockingScheduler({'apscheduler.executors.default': {'class': 'apscheduler.executors.pool:ThreadPoolExecutor', 'max_workers': '2'}})
    scheduler.add_job(job, 'interval', seconds=2, args=(1,))
    scheduler.add_job(job, 'interval', seconds=2, args=(2,))
    scheduler.add_job(job, 'interval', seconds=2, args=(3,))
    scheduler.add_job(job, 'interval', seconds=2, args=(4,))

    try:
        scheduler.start()
    except (KeyboardInterrupt, SystemExit):
        pass

将剩余作业添加到线程池或者诸如queue scheme或multiprocessing.dummy.pool

之类的任何方法

2 个答案:

答案 0 :(得分:1)

因任何原因错过预定时间的工作被视为失败,并且这些工作未启动。在你的情况下,由于缺乏自由工作者,工作失误。将参数misfire_grace_time=1(或其他时间)添加到add_job来电。

答案 1 :(得分:0)

也许您想使用多个线程池执行程序并将某些作业限制为某些执行程序?