class Task(Action): """ Use deferred to detach action execution from from caller, allowing registration by caller to task for getting results asynchronously. """ def __init__(self, *args, **kw): self.deferred = Deferred() super(Task, self).__init__(*args, **kw) def get_deferred(self): return self.deferred def invoke(self, *args, **kw): try: result = super(Task, self).invoke(*args, **kw) except Exception, error: msglog.log('broadway', msglog.types.WARN, "Task '%s' execution failed." % self) msglog.exception(prefix="handled") self.deferred.failed(error) else:
def send_request(self, request): """ Send request message. A Deferred instance is returned immediately, which can then be used to wait on the response, or to register a call-back instead. Value returned via deferred will be the response message itself. """ deferred = Deferred() self.deferreds[request.getheader("CORID")] = deferred request.setheader("REPLY-TO", self.responses.geturl()) self.messaging.route(request) return deferred
def invoke(*args, **kw): deferred = Deferred() try: result = invocable(*args, **kw) except Exception, error: deferred.failed(error)
def __init__(self, *args, **kw): self.deferred = Deferred() super(Task, self).__init__(*args, **kw)
def receive(self, blocking=True, timeout=None): with self.synclock: deferred = Deferred() self.deferreds.add(deferred) return deferred.getvalue(blocking, timeout)