如何使用 APScheduler 将作业添加到线程池

How to add jobs to threadpool with 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

将剩余作业添加到线程池或队列方案之类的任何方法或multiprocessing.dummy.pool

因任何原因错过预定时间的作业将被识别为未启动,并且不会启动这些作业。在您的情况下,由于缺乏免费工人,工作失败了。将参数 misfire_grace_time=1(或其他时间)添加到 add_job 调用。

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