code: def send_request(self, request, callback=None, timeout=None, no_response=False):  # pragma: no cover
          
          if callback is not None:
              thread = threading.Thread(target=self._thread_body, args=(request, callback))
              thread.start()
          else:
              self.protocol.send_message(request)
              if no_response:
                  return
              try:
                  response = self.queue.get(block=True, timeout=timeout)
              except Empty:
                  #if timeout is set
                  response = None
              return response
docs: Send a request to the remote server.
  
          :param request: the request to send
          :param callback: the callback function to invoke upon response
          :param timeout: the timeout of the request
          :return: the response