:type message_generator: generator of dict
        :param message_generator: Generates messages from slack that should be run

        :type fire_all: bool
        :param fire_all: Whether to also fire messages to the event bus

        :type tag: str
        :param tag: The tag to send to use to send to the event bus

        :type interval: int
        :param interval: time to wait between ending a loop and beginning the next

def run_command_async(self, msg):

        '''
        :type message_generator: generator of dict
        :param message_generator: Generates messages from slack that should be run

        :type fire_all: bool
        :param fire_all: Whether to also fire messages to the event bus

        :type tag: str
        :param tag: The tag to send to use to send to the event bus

        :type interval: int
        :param interval: time to wait between ending a loop and beginning the next

        '''
        log.debug('Going to run a command asynchronous')
        runner_functions = sorted(salt.runner.Runner(__opts__).functions)
        # Parse args and kwargs
        cmd = msg['cmdline'][0]

        args, kwargs = self.parse_args_and_kwargs(msg['cmdline'])

        # Check for pillar string representation of dict and convert it to dict
        if 'pillar' in kwargs:
            kwargs.update(pillar=ast.literal_eval(kwargs['pillar']))

        # Check for target. Otherwise assume None
        target = msg['target']['target']
        # Check for tgt_type. Otherwise assume glob
        tgt_type = msg['target']['tgt_type']
        log.debug('target_type is: %s', tgt_type)

        if cmd in runner_functions:
            runner = salt.runner.RunnerClient(__opts__)
            log.debug('Command %s will run via runner_functions', cmd)
            # pylint is tripping
            # pylint: disable=missing-whitespace-after-comma
            job_id_dict = runner.asynchronous(cmd, {'args': args, 'kwargs': kwargs})
            job_id = job_id_dict['jid']

        # Default to trying to run as a client module.
        else:
            local = salt.client.LocalClient()
            log.debug('Command %s will run via local.cmd_async, targeting %s', cmd, target)
            log.debug('Running %s, %s, %s, %s, %s', target, cmd, args, kwargs, tgt_type)
            # according to https://github.com/saltstack/salt-api/issues/164, tgt_type has changed to expr_form
            job_id = local.cmd_async(six.text_type(target), cmd, arg=args, kwarg=kwargs, tgt_type=six.text_type(tgt_type))
            log.info('ret from local.cmd_async is %s', job_id)
        return job_id