gpt4 book ai didi

python - 如何提前时钟并完成所有事件

转载 作者:太空宇宙 更新时间:2023-11-03 15:08:03 24 4
gpt4 key购买 nike

阅读此 answer (第 2 点)关于与 Twistedtask.Clock 相关的问题,用于测试目的,我发现很奇怪,没有办法从 提前时钟t0t1,同时捕获 t0t1 中的所有 callLater 调用。

当然,您可以通过执行以下操作来解决此问题:

clock = task.Clock()
reactor.callLater = clock.callLater

...

def advance_clock(total_elapsed, step=0.01):
elapsed = 0
while elapsed < total_elapsed:
clock.advance(step)
elapsed += step

...

time_to_advance = 10 # seconds
advance_clock(time_to_advance)

但随后我们将问题转向选择足够小的 step,这对于从概率分布中采样时间的 callLater 调用来说可能非常棘手,例如.

有人能想出解决这个问题的方法吗?

最佳答案

I found very weird that there is no way to advance the clock from t0 to t1 while catching all the callLater calls within t0 and t1.

根据您稍后在问题中所写的内容,我假设您指出的情况是以下示例程序演示的情况:

from twisted.internet.task import Clock

def foo(reactor, n):
if n == 0:
print "Done!"
reactor.callLater(1, foo, reactor, n - 1)

reactor = Clock()
foo(reactor, 10)
reactor.advance(10)

人们可能希望这个程序打印 Done! 但它没有。如果最后一行替换为:

for i in range(10):
reactor.advance(1)

然后生成的程序确实打印Done!

时钟 以这种方式工作的原因是它正是真实 时钟的工作方式。据我所知,没有计算机时钟可以连续时间系统运行。我不会说不可能在具有离散步骤的时钟上实现一个定时事件系统,这样它似乎可以提供连续的时间流 - 但我会说 Twisted 没有尝试这样做。

Clock 和真正的 reactor 实现之间唯一真正的区别是使用 Clock可以使时间步长比你大得多很可能会遇到真实 react 器的典型用法。

但是,对于真实的 react 堆来说,很可能会出现这样一种情况,即大量时间都在一个离散的步骤中流逝。这可能是因为系统时钟发生了变化(有一些讨论可以独立于系统时钟来安排事件,这样这种情况就会消失)或者可能是因为某些应用程序代码阻塞了 react 器一段时间(实际上,应用程序代码总是阻塞 react 堆!但在典型的程序中,它只会阻塞足够短的时间,大多数人都可以忽略)。

Clock 提供一种模拟这些大步骤的方法,可以编写测试程序在出现其中一种情况时执行的操作。例如,也许你真的很关心,当内核因为 Linux I/O 电梯算法中的一个奇怪的怪癖而决定不安排你的程序 2.1 秒时,你的物理引擎仍然计算 2.1 秒的物理,即使你的 420 次调用已跳过 200Hz 模拟循环。

可以公平地说,Twisted 提供的默认(标准?仅?)基于时间的测试工具应该对常见情况更友好……或者不是。也许这会鼓励人们编写仅在常见情况下有效的程序,并在出现不常见(但最终不可避免)情况时中断现实世界。我不确定。

关于迈克关于准确推进到下一个预定通话的建议,您可以轻松地做到这一点,而无需破解任何内部结构。 clock.advance(clock.getDelayedCalls()[0].getTime() - clock.seconds()) 会做这个(也许你会争辩说 Clock 会更好如果它至少为此提供了一个明显的辅助函数来简化对常见情况的测试)。请记住,真正的时钟不会像这样前进,所以如果您的代码在您使用此技巧时在单元测试中具有某种理想的行为,请不要误以为这意味着相同的理想行为将存在于实际使用中。

关于python - 如何提前时钟并完成所有事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30415976/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com