def __iter__(self): request = self.request rpc = request['rpc'] status_code = 200 try: result = rpc.process(request) except Exception as e: result = as_failure(e) handler = rpc.handler result = maybe_async(result) while is_async(result): yield b'' result = maybe_async(result) try: if is_failure(result): e = result.trace[1] status_code = getattr(e, 'status', 400) log_failure(result) result = handler.dumps(rpc.id, rpc.version, error=e) else: result = handler.dumps(rpc.id, rpc.version, result=result) except Exception as e: LOGGER.error('Could not serialize', exc_info=True) status_code = 500 result = handler.dumps(rpc.id, rpc.version, error=e) content = to_bytes(result) response = WsgiResponse(status_code, content, content_type=handler.content_type) for c in self.start(response): yield c
def start(self, worker): '''Called by the :class:`pulsar.Worker` *worker* when the task start its execution. If no timeout has occured the task will switch to a ``STARTED`` :attr:`Task.status` and invoke the :meth:`on_start` callback.''' job = registry[self.name] result = None try: if self.maybe_revoked(): yield self.on_timeout(worker) else: self.status = STARTED self.time_start = datetime.now() yield self.on_start(worker) consumer = TaskConsumer(self, worker, job) result = maybe_async(job(consumer, *self.args, **self.kwargs)) if is_async(result): yield result result = maybe_async(result) except Exception as e: result = as_failure(e) finally: yield self.finish(worker, result)