高级Python调度程序(apscheduler)是否交错在同一秒内触发的事件?
我一直在将python“apscheduler”包()编码到我的应用程序中,到目前为止,它运行得很好,我几乎可以用它完成我预想的所有事情 只剩下一个扭结需要熨平 my events正在调用的函数每秒只接受大约3次调用或失败,因为它触发了非常慢的硬件I/O:( 我曾尝试将线程池中的最大线程数从20个限制为1个,以尝试降低执行速度,但由于我并没有在apscheduler上增加一点负载,因此我的事件仍然几乎同时启动(嗯……至少非常非常接近)高级Python调度程序(apscheduler)是否交错在同一秒内触发的事件?,python,events,concurrency,apscheduler,Python,Events,Concurrency,Apscheduler,我一直在将python“apscheduler”包()编码到我的应用程序中,到目前为止,它运行得很好,我几乎可以用它完成我预想的所有事情 只剩下一个扭结需要熨平 my events正在调用的函数每秒只接受大约3次调用或失败,因为它触发了非常慢的硬件I/O:( 我曾尝试将线程池中的最大线程数从20个限制为1个,以尝试降低执行速度,但由于我并没有在apscheduler上增加一点负载,因此我的事件仍然几乎同时启动(嗯……至少非常非常接近) 有没有办法“错开”在同一秒内触发的不同事件?我不知道apsc
有没有办法“错开”在同一秒内触发的不同事件?我不知道apscheduler,但您是否考虑过使用Redis列表(队列)并简单地将事件提要序列化到一个临界边界函数中,使其每秒触发不超过三次?(例如,您可以让它以1秒的最大延迟执行阻塞弹出,增加每个事件的触发器计数,在达到3时休眠,并在阻塞弹出超时时将触发器计数归零(或者您可以在每个事件后使用333毫秒休眠).我不知道apscheduler,但您是否考虑过使用Redis列表(队列)并简单地将事件提要序列化到一个临界边界函数中,使其每秒触发不超过三次?(例如,您可以让它以1秒的最大延迟执行阻塞弹出,增加每个事件的触发器计数,在达到3时休眠,并在阻塞弹出超时时将触发器计数归零(或者您可以在每个事件后仅使用333毫秒休眠)。我的解决方案供将来参考:
我在被调用的函数中添加了一个基本bool锁和一个wait,这似乎很好地解决了问题,因为引发错误的不是函数本身的调用,而是函数执行的死锁情况:D我的解决方案供将来参考:
我在被调用的函数中添加了一个基本bool锁和一个wait,这似乎很好地解决了问题,因为引起错误的不是函数本身的调用,而是函数执行的死锁情况:D我最近发现了这个问题,因为我和你一样,正试图错开预定的时间为弥补硬件速度慢的缺点,需要对作业进行微调 在调度程序
add_job
调用中包含这样的参数会将每个作业的开始时间错开200ms(同时为每个作业递增idx
):
我最近发现了这个问题,因为我和你一样,试图稍微错开预定的作业,以补偿缓慢的硬件 在调度程序
add_job
调用中包含这样的参数会将每个作业的开始时间错开200ms(同时为每个作业递增idx
):
您想要使用的是“抖动”选项 发件人: 抖动选项使您能够将随机组件添加到 执行时间。如果您有多个服务器和 不要让他们在同一时刻运行作业,或者如果你愿意的话 防止具有类似选项的多个作业始终运行 同时 例如:
#每小时运行一次“作业”功能,随机选择一个额外的延迟
#在[-120,+120]秒的窗口内。
计划添加作业(作业功能“间隔”,小时数=1,抖动=120)
您想要使用的是“抖动”选项
发件人:
抖动选项使您能够将随机组件添加到
执行时间。如果您有多个服务器和
不要让他们在同一时刻运行作业,或者如果你愿意的话
防止具有类似选项的多个作业始终运行
同时
例如:
#每小时运行一次“作业”功能,随机选择一个额外的延迟
#在[-120,+120]秒的窗口内。
计划添加作业(作业功能“间隔”,小时数=1,抖动=120)
Thnak you,这是一个非常好的建议,但经过一点小的修改后,我在被调用的函数中添加了一个基本布尔锁和一个等待,这似乎很好地实现了这一点,因为引发错误的不是函数本身的调用,而是函数执行的死锁情况:d此线程可能更复杂如果你展示了一些代码,可能只是对相关函数的前/后处理过的代码,这对后人很有用。Thnak,这是一个很好的建议,但是经过一点小的修改,我在被调用的函数中添加了一个基本的布尔锁和一个等待,这似乎很好地完成了这项工作-因为不是函数本身的调用引起了问题错误,而是函数执行的死锁情况:如果您显示了一些代码,则此线程可能对后代更有用,可能只是相关函数的前/后清理。
next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=idx * 0.2)