code: def callback_request(self, msg, reply_cb=None, inform_cb=None,
                           user_data=None, timeout=None, use_mid=None):
          
          if timeout is None:
              timeout = self._request_timeout
  
          mid = self._get_mid_and_update_msg(msg, use_mid)
  
          if timeout is None:  # deal with 'no timeout', i.e. None
              timeout_handle = None
          else:
              timeout_handle = self.ioloop.call_later(
                  timeout, partial(self._handle_timeout, mid, self.ioloop.time()))
  
          self._push_async_request(
              mid, msg, reply_cb, inform_cb, user_data, timeout_handle)
  
          try:
              self.send_request(msg)
          except KatcpClientError, e:
              error_reply = Message.request(msg.name, "fail", str(e))
              error_reply.mid = mid
              self.handle_reply(error_reply)
docs: Send a request messsage.
  
          Parameters
          ----------
          msg : Message object
              The request message to send.
          reply_cb : function
              The reply callback with signature reply_cb(msg)
              or reply_cb(msg, \*user_data)
          inform_cb : function
              The inform callback with signature inform_cb(msg)
              or inform_cb(msg, \*user_data)
          user_data : tuple
              Optional user data to send to the reply and inform
              callbacks.
          timeout : float in seconds
              How long to wait for a reply. The default is the
              the timeout set when creating the AsyncClient.
          use_mid : boolean, optional
              Whether to use message IDs. Default is to use message IDs
              if the server supports them.