def run(self): if self.is_forwarder: spawn_greenlet(Forwarder, self.name, self.pid) else: self.publisher = Publisher(self.name, self.pid) self.subscriber = Subscriber(self.on_message_callback, self.name, self.pid) spawn_greenlet(self.subscriber.serve_forever)
class IPCAPI(object): """ API through which IPC is performed. """ def __init__(self, is_forwarder, name=None, on_message_callback=None, pid=None): self.is_forwarder = is_forwarder self.name = name self.on_message_callback = on_message_callback self.pid = pid def run(self): if self.is_forwarder: spawn_greenlet(Forwarder, self.name, self.pid) else: self.publisher = Publisher(self.name, self.pid) self.subscriber = Subscriber(self.on_message_callback, self.name, self.pid) spawn_greenlet(self.subscriber.serve_forever) def publish(self, payload): self.publisher.publish(payload) def _get_response(self, fifo, buffer_size, fifo_ignore_err=fifo_ignore_err, empty=('', None)): try: buff = StringIO() data = object( ) # Just a sentinel because '' or None are expected from os.read while data not in empty: data = os.read(fifo, 1) buff.write(data) response = buff.getvalue() status = response[:IPC.STATUS.LENGTH] response = response[IPC.STATUS.LENGTH + 1:] # Add 1 to account for the separator is_success = status == IPC.STATUS.SUCCESS if is_success: response = loads(response) if response else '' buff.close() return is_success, response except OSError, e: if e.errno not in fifo_ignore_err: raise
def _get_pid_publisher(self, cluster_name, server_name, target_pid): # We do no have a publisher connected to that PID, so we need to create it .. if target_pid not in self.pid_publishers: # Create a publisher and sleep for a moment until it connects to the other socket publisher = Publisher(self.get_endpoint_name(cluster_name, server_name, target_pid), self.pid) # We can tolerate it because it happens only the very first time our PID invokes target_pid sleep(0.1) # We can now store it for later use self.pid_publishers[target_pid] = publisher # At this point we are sure we have a publisher for target PID return self.pid_publishers[target_pid]