高级Python调度程序(apscheduler)交错事件在同一秒内触发?

时间:2013-05-11 04:28:48

标签: python events concurrency apscheduler

我一直在编写python“apscheduler”软件包(Advanced Python Scheduler | http://pypi.python.org/pypi/APScheduler/)到我的应用程序中,到目前为止它已经很好了,我几乎可以完成我设想用它做的所有事情

只剩下一个纠结... ...

我的事件调用的函数每秒只接受大约3次调用或失败,因为它触发了非常慢的硬件I / O :(

我已经尝试将线程池中的最大线程数从20限制为1,以尝试减慢执行速度,但由于我并没有真正对apscheduler施加一点负担,因此我的事件仍然会同时触发(嗯...至少非常非常接近。)

有没有办法'错开'在同一秒内发射的不同事件?

4 个答案:

答案 0 :(得分:3)

我最近发现了这个问题,因为我和你一样,试图略微错开预定的工作来弥补硬件的缓慢。

在调度程序add_job调用中包含这样的参数会使每个作业的开始时间错开200ms(同时为每个作业递增idx):

next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=idx * 0.2)

答案 1 :(得分:0)

我不知道有关apscheduler但您是否考虑使用Redis LIST(队列)并简单地将事件提要序列化为一个临界限制函数,以便每秒触发不超过三次? (例如,你可以让它做一个具有一秒最大延迟的阻止POP,增加每个事件的触发计数,当它击中三个时休眠,并且在阻止POP超时的任何时候触发计数为零(或者你可以使用)每次事件后休眠333毫秒。

答案 2 :(得分:0)

我的解决方案供将来参考:

我在被调用的函数中添加了一个基本的bool锁,并且似乎很好地执行了一个等待 - 因为它不是调用函数本身引发错误,而是函数执行的死锁情况:d

答案 3 :(得分:0)

您要使用的是“抖动”选项。

来自the docs

  

通过抖动选项,您可以将随机分量添加到   执行时间处理时间。如果您有多台服务器,并且   不想让他们在同一时间或如果您愿意   防止具有相似选项的多个作业始终运行   同时

示例:

# Run the `job_function` every hour with an extra-delay picked randomly 
# in a [-120,+120] seconds window.
sched.add_job(job_function, 'interval', hours=1, jitter=120)