如何使用 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
调用。
也许您想使用多个线程池执行器并将某些作业限制在某些执行器上?
我是 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
调用。
也许您想使用多个线程池执行器并将某些作业限制在某些执行器上?