docs: def run_job_async(
              self,
              tgt,
              fun,
              arg=(),
              tgt_type='glob',
              ret='',
              timeout=None,
              jid='',
              kwarg=None,
              listen=True,
              io_loop=None,
              **kwargs):
          '''
          Asynchronously send a command to connected minions
  
          Prep the job directory and publish a command to any targeted minions.
  
          :return: A dictionary of (validated) ``pub_data`` or an empty
              dictionary on failure. The ``pub_data`` contains the job ID and a
              list of all minions that are expected to return data.
  
          .. code-block:: python
  
              >>> local.run_job_async('*', 'test.sleep', [300])
              {'jid': '20131219215650131543', 'minions': ['jerry']}
          '''
          arg = salt.utils.args.parse_input(arg, kwargs=kwarg)
  
          try:
              pub_data = yield self.pub_async(
                    tgt,
                    fun,
                    arg,
                    tgt_type,
                    ret,
                    jid=jid,
                    timeout=self._get_timeout(timeout),
                    io_loop=io_loop,
                    listen=listen,
                    **kwargs)
          except SaltClientError:
              # Re-raise error with specific message
              raise SaltClientError(
                  'The salt master could not be contacted. Is master running?'
              )
          except AuthenticationError as err:
              raise AuthenticationError(err)
          except AuthorizationError as err:
              raise AuthorizationError(err)
          except Exception as general_exception:
              # Convert to generic client error and pass along message
              raise SaltClientError(general_exception)
  
          raise tornado.gen.Return(self._check_pub_data(pub_data, listen=listen))