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