'Start the server
NOTE: The context manager is the recommended way to use
ForwardServer. start()/stop() are alternatives to the context manager
use case and are mutually exclusive with it.
:returns: self'

def start(self):

    queue = multiprocessing.Queue()
    self._subproc = multiprocessing.Process(target=_run_server, kwargs=dict(local_addr=self._server_addr, local_addr_family=self._server_addr_family, local_socket_type=self._server_socket_type, local_linger_args=self._local_linger_args, remote_addr=self._remote_addr, remote_addr_family=self._remote_addr_family, remote_socket_type=self._remote_socket_type, queue=queue))
    self._subproc.daemon = True
    self._subproc.start()
    try:
        (self._server_addr_family, self._server_addr) = queue.get(block=True, timeout=self._SUBPROC_TIMEOUT)
        queue.close()
    except Exception:
        try:
            self._logger.exception('Failed    while    waiting    for    local    socket    info')
            raise
        finally:
            try:
                self.stop()
            except Exception:
                self._logger.exception('Emergency    subprocess    shutdown    failed')
    return self
