我一直在编写python“apscheduler”软件包(Advanced Python Scheduler | http://pypi.python.org/pypi/APScheduler/)到我的应用程序中,到目前为止它已经很好了,我几乎可以完成我设想用它做的所有事情
只剩下一个纠结... ...
我的事件调用的函数每秒只接受大约3次调用或失败,因为它触发了非常慢的硬件I / O :(
我已经尝试将线程池中的最大线程数从20限制为1,以尝试减慢执行速度,但由于我并没有真正对apscheduler施加一点负担,因此我的事件仍然会同时触发(嗯...至少非常非常接近。)
有没有办法'错开'在同一秒内发射的不同事件?
答案 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)