gpt4 book ai didi

python - 如何使用generate_events事件?

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

以下 python3 代码是我可能期望生成对 doit 事件的一些调用,然后调用终止事件,这将停止应用程序,但只会触发第一个事件。我做错了什么?

from circuits import Component, Event, Debugger
import time

times = []

class doit(Event):
"""doit Event"""

class terminate(Event):
"""terminate Event"""

class App(Component):
def __init__(self):
super().__init__()
self.interval = .1
self.last = 0
self.count = 0

def doit(self, origin):
times.append(("%s from A at %.03f" % (origin, time.time())))
self.count += 1
self.last = time.time()

def generate_events(self, event):
if self.last + self.interval < time.time():
event.stop()
self.fire(doit('ge'))
if self.count >= 5:
event.stop()
self.fire(terminate())

def terminate(self):
self.stop()


(Debugger() + App()).run()

print("\n".join(times))

我使用 event.reduce_time_left(0) 而不是 event.stop() 得到了相同的行为。

最佳答案

该示例中的主要错误是,当无事可做时,它不会reduce_time_left(time.time() - self.last + self.interval)

generate_events 在应用启动时触发一次。每个生成器都需要在再次触发之前将 reduce_time_left() 设置为最大合理时间 - 这样到那时它肯定会再次触发 - 无论是否生成某些内容。将时间减少到 0 表示此周期已完成(并且需要触发事件)。

首选解决方案使用Timer来实现时间功能,将此示例简化为显示其工作原理的逻辑。

from circuits import BaseComponent, Event, Timer, Debugger, handler
import time

class doit(Event):
"""doit Event"""

class App(BaseComponent):
timer = Timer(.1, doit('A'), persist=True)

def __init__(self):
super().__init__()
self.count = 0

@handler("doit")
def _doit(self, origin):
print("%s from A at %.03f" % (origin, time.time()))
self.count += 1
if self.count > 4:
self.stop()

(App() + Debugger()).run()

关于python - 如何使用generate_events事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38810388/

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