我如何使用generate_events事件?

时间:2016-08-07 02:39:09

标签: 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"""

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()获得了相同的行为。

1 个答案:

答案 0 :(得分:1)

示例中的主要错误是当没有任何事情可做时它不会generate_events

应用启动时,

reduce_time_left()会触发一次。每个生成器需要将Timer设置为再次触发之前的最大合理时间 - 这样它肯定会在那个时间再次触发 - 无论是否生成某些东西。将时间减少到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() 来实现时间功能,将此示例缩减为逻辑以显示其工作原理。

<security:http auto-config="true" use-expressions="true" authentication-manager-ref="webAccess">

    <security:intercept-url pattern="/user/**" access="hasRole('ROLE_ADMIN')" />        
    <security:access-denied-handler error-page="/403" />

    <security:form-login 
        login-processing-url="/login"
        login-page="/loginform" 
        default-target-url="/" 
        authentication-failure-url="/loginform?error=1" 
        username-parameter="username"
        password-parameter="password" />

    <security:logout logout-url="/logout" logout-success-url="/" delete-cookies="JSESSIONID" />
    <security:csrf />

</security:http>

    <security:authentication-manager id="webAccess">


      <security:authentication-provider>
        <security:user-service>
            <security:user name="admin" password="admin" authorities="ROLE_ADMIN" />
            <security:user name="user" password="user" authorities="ROLE_EDITOR" />
       </security:user-service>
    </security:authentication-provider>

  </security:authentication-manager>