Python 如何使用generate_events事件?

Python 如何使用generate_events事件?,python,circuits-framework,Python,Circuits Framework,下面的python3代码可能是我所期望的生成对doit事件的一些调用,然后是对terminate事件的调用,这将停止应用程序,但只有第一个事件触发。我做错了什么 from circuits import Component, Event, Debugger import time times = [] class doit(Event): """doit Event""" class terminate(Event): """terminate Event""" clas

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

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))
从电路导入组件、事件、调试器
导入时间
时间=[]
类doit(事件):
“doit事件”
类终止(事件):
“”“终止事件”“”
类应用程序(组件):
定义初始化(自):
super()。\uuuu init\uuuuu()
self.interval=.1
self.last=0
self.count=0
def doit(自身,原点):
times.append((%s来自at%.03f“%(源,time.time()))
self.count+=1
self.last=time.time()
def生成_事件(自身、事件):
如果self.last+self.interval=5:
事件停止()
self.fire(terminate())
def终止(自我):
self.stop()
(调试器()+应用程序()).run()
打印(“\n”.join(次))

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

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

generate_events
在应用程序启动时触发一次。每台发电机都需要设置
将\u time\u left()
减少到再次点火前的最大合理时间,以便在该时间之前它肯定会再次点火,无论是否生成了什么。将时间减少到0表示此循环已完成(需要触发事件)

首选解决方案使用
定时器
实现时间功能,将此示例简化为显示其工作方式的逻辑

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

上述内容的更正版本是:--NB:您正在有效地重新实现
电路。计时器
generate_events
是一种用于(显然)“生成事件”的内部机制,但其方式不消耗CPU周期“轮询”。这就是我们实现所有I/O轮询器和计时器的方式。非常有用,谢谢!我可能会用定时器。我想我遗漏的部分是为了减少剩余时间()。我发现任意数量的生成器都可能在x时间之后生成某个事件,并且每个生成器都应该根据其与最近调用的时间的最大间隔来减少剩余时间,以便该事件在下次发生时(而不是之前)发生.准确地说:)那么,为了他人的利益,你想回答自己的问题吗?回答得好!谢谢:)