class_docstr: An object that connects Engines to each other.
  north and east sockets listen, while south and west sockets connect.
  
  This class is useful in cases where there is a set of nodes that
  must communicate only with their nearest neighbors.
code: def __init__(self, interface="tcp://*", identity=None):
      self._ctx = zmq.Context()
      self.north = self._ctx.socket(zmq.PAIR)
      self.west = self._ctx.socket(zmq.PAIR)
      self.south = self._ctx.socket(zmq.PAIR)
      self.east = self._ctx.socket(zmq.PAIR)
  
      # bind to ports
      northport = self.north.bind_to_random_port(interface)
      eastport = self.east.bind_to_random_port(interface)
  
      self.north_url = interface + ":%i" % northport
      self.east_url = interface + ":%i" % eastport
  
      # guess first public IP from socket
      self.location = socket.gethostbyname_ex(socket.gethostname())[-1][
          0
      ]
  
file_path: ipyparallel/examples/wave2D/communicator.py
imports: import socket
  import zmq
  from ipyparallel.util import disambiguate_url
label_desc: Use image node_id 1 to create a new EngineCommunicator object  with example: obj = EngineCommunicator(interface, identity)