示例#1
0
文件: core.py 项目: sublee/zeronimo
 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
示例#2
0
文件: core.py 项目: sublee/zeronimo
 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()