def __call__(self): while True: try: header, payload, __ = recv(self.socket) except GreenletExit: break except zmq.ZMQError: exc = TaskClosed('Collector socket closed') for results in viewvalues(self.results): for result in viewvalues(results): result.set_exception(exc) break except: # TODO: warn MalformedMessage continue method, call_id, task_id = header method = ord(method) reply = Reply(method, call_id, task_id) if method & ACK: value = payload or None else: value = self.unpack(payload) self.trace and self.trace(method, (call_id, task_id, value)) del header, payload, method, call_id, task_id try: self.dispatch_reply(reply, value) except KeyError: # TODO: warning continue finally: del reply, value
def __call__(self): """Runs the worker. While running, an RPC service is online.""" poller = zmq.Poller() for socket in self.sockets: poller.register(socket, zmq.POLLIN) group = self.greenlet_group msgs = [] capture = msgs.extend def accept(socket, call, args, kwargs, topics): group.spawn(self.work, socket, call, args, kwargs, topics) group.join(0) def reject(socket, call, topics): __, call_id, reply_to, __, __ = call reply_socket, topics = self.replier(socket, topics, reply_to) self.reject(reply_socket, call_id, topics) def reject_if(call, topics): if self.reject_if(call, topics): return True try: __, rpc_spec = self.find_call_target(call) except KeyError: return True return rpc_spec.reject_if.__get__(self.app)(call, topics) try: while True: for socket, event in safe(poller.poll): assert event & zmq.POLLIN del msgs[:] try: header, payload, topics = recv(socket, capture=capture) call = parse_call(header) if group.full() or reject_if(call, topics): reject(socket, call, topics) continue args, kwargs = self.unpack(payload) except: # If any exception occurs in the above block, # the messages are treated as malformed. handle = self.malformed_message_handler if handle is not None: exc_info = sys.exc_info() handle(self, exc_info, msgs[:]) del handle continue # Accept the call. accept(socket, call, args, kwargs, topics) # Release memory. try: del header, payload, topics del call del args, kwargs except UnboundLocalError: # Stop at the first error. pass finally: group.kill()