def _send(self, event, channel, errors=False, log=True): eargs = event.args ekwargs = event.kwargs r = False for handler in self._getHandlers(channel): try: #stime = time.time() if handler._passEvent: r = handler(event, *eargs, **ekwargs) else: r = handler(*eargs, **ekwargs) #etime = time.time() #ttime = (etime - stime) * 1e3 #print "%s: %0.02f ms" % (reprhandler(handler), ttime) except (KeyboardInterrupt, SystemExit): raise except: if log: etype, evalue, etraceback = _exc_info() self.push(Error(etype, evalue, etraceback, handler=handler)) if errors: raise else: _exc_clear() if r is not None and r and handler.filter: return r return r
def run(self, sleep=0, mode=None, errors=False, log=True, __self=None): if __self is not None: self = __self if not mode == "T": #signal(SIGHUP, self._signal) signal(SIGINT, self._signal) signal(SIGTERM, self._signal) self._running = True self.push(Started(self, mode), "started") try: while self._running: try: [f() for f in self.ticks.copy()] self.flush() if sleep: try: time.sleep(sleep) except: pass except (KeyboardInterrupt, SystemExit): self._running = False except: try: if log: self.push(Error(*_exc_info()), "error") if errors: raise else: _exc_clear() except: pass finally: try: self.push(Stopped(self), "stopped") rtime = time.time() while len(self) > 0 and (time.time() - rtime) < 3: [f() for f in self.ticks.copy()] self.flush() if sleep: time.sleep(sleep) rtime = time.time() except: pass
def send(self, event, channel, target=None, errors=False, log=True): """Send a new Event to Event Handlers for the Target and Channel This will send the given Event, to the spcified CHannel on the Target Component's Channel. if target is None, then target will be set as the Channel of the current Component, self.channel (defaulting back to None). If this Component's Manager is itself, enqueue on this Component's Event Queue, otherwise enqueue on this Component's Manager. @param event: The Event Object @type event: Event @param channel: The Channel this Event is bound for @type channel: str @keyword target: The target Component's channel this Event is bound for @type target: str or Component @keyword errors: True to raise errors, False otherwise @type errors: bool @keyword log: True to log errors, False otherwise @type log: bool @return: The return value of the last executed Event Handler @rtype: object """ if target is None: target = getattr(self, "channel", None) if self.manager == self: event.channel = channel event.target = target eargs = event.args ekwargs = event.kwargs if target is not None and isinstance(target, Component): target = getattr(target, "channel", None) if target is not None and type(target) == str: channel = "%s:%s" % (target, channel) r = False for handler in self._getHandlers(channel): try: if handler._passEvent: r = partial(handler, event, *eargs, **ekwargs)() else: r = partial(handler, *eargs, **ekwargs)() except (KeyboardInterrupt, SystemExit): raise except: if log: self.push(Error(*_exc_info()), "error") if errors: raise else: _exc_clear() if r is not None and r and handler.filter: return r return r else: return self.manager.send(event, channel, target, errors, log)