2

我一直在将python“apscheduler”包(Advanced Python Scheduler)编码到我的应用程序中,到目前为止一切顺利,我几乎可以完成我设想的所有事情。

只剩下一个扭结要解决了……

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

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

有没有办法“错开”在同一秒内触发的不同事件?

4

4 回答 4

3

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

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

next_run_time=datetime.datetime.now() + datetime.timedelta(seconds=idx * 0.2)
于 2016-04-11T02:57:48.477 回答
1

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

文档

jitter 选项使您能够将随机分量添加到执行时间。如果您有多个服务器并且不希望它们在完全相同的时刻运行作业,或者如果您想防止具有相似选项的多个作业始终同时运行,这可能会很有用

例子:

# 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)
于 2019-09-19T15:23:19.153 回答
0

我不了解 apscheduler,但您是否考虑过使用 Redis LIST(队列)并将事件馈送简单地序列化到一个临界有界函数中,使其每秒触发不超过 3 次?(例如,您可以让它以一秒的最大延迟执行阻塞 POP,增加每个事件的触发计数,当它达到 3 时休眠,并在阻塞 POP 超时时将触发计数归零(或者您可以只使用每个事件后睡眠 333 毫秒)。

于 2013-05-11T05:12:59.723 回答
0

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

我在被调用的函数中添加了一个基本的布尔锁和一个等待,这似乎很好地完成了这个技巧 - 因为引发错误的不是函数本身的调用,而是函数执行的死锁情况:D

于 2013-05-11T06:25:51.263 回答