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 invoke(*args, **kw): deferred = Deferred() try: result = invocable(*args, **kw) except Exception, error: deferred.failed(error)