如何使用 generate_events 事件?

How do I use the generate_events event?

以下 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()