code: def async_task(func, *args, **kwargs):
      
      keywords = kwargs.copy()
      opt_keys = (
      'hook', 'group', 'save', 'sync', 'cached', 'ack_failure', 'iter_count', 'iter_cached', 'chain', 'broker')
      q_options = keywords.pop('q_options', {})
      # get an id
      tag = uuid()
      # build the task package
      task = {'id': tag[1],
              'name': keywords.pop('task_name', None) or q_options.pop('task_name', None) or tag[0],
              'func': func,
              'args': args}
      # push optionals
      for key in opt_keys:
          if q_options and key in q_options:
              task[key] = q_options[key]
          elif key in keywords:
              task[key] = keywords.pop(key)
      # don't serialize the broker
      broker = task.pop('broker', get_broker())
      # overrides
      if 'cached' not in task and Conf.CACHED:
          task['cached'] = Conf.CACHED
      if 'sync' not in task and Conf.SYNC:
          task['sync'] = Conf.SYNC
      if 'ack_failure' not in task and Conf.ACK_FAILURES:
          task['ack_failure'] = Conf.ACK_FAILURES
      # finalize
      task['kwargs'] = keywords
      task['started'] = timezone.now()
      # signal it
      pre_enqueue.send(sender="django_q", task=task)
      # sign it
      pack = SignedPackage.dumps(task)
      if task.get('sync', False):
          return _sync(pack)
      # push it
      enqueue_id = broker.enqueue(pack)
      logger.info('Enqueued {}'.format(enqueue_id))
      logger.debug('Pushed {}'.format(tag))
      return task['id']
docs: Queue a task for the cluster.