code: def task(self, _fn=None, queue=None, hard_timeout=None, unique=None,
               lock=None, lock_key=None, retry=None, retry_on=None,
               retry_method=None, schedule=None, batch=False,
               max_queue_size=None):
          
  
          def _delay(func):
              def _delay_inner(*args, **kwargs):
                  return self.delay(func, args=args, kwargs=kwargs)
              return _delay_inner
  
          # Periodic tasks are unique.
          if schedule is not None:
              unique = True
  
          def _wrap(func):
              if hard_timeout is not None:
                  func._task_hard_timeout = hard_timeout
              if queue is not None:
                  func._task_queue = queue
              if unique is not None:
                  func._task_unique = unique
              if lock is not None:
                  func._task_lock = lock
              if lock_key is not None:
                  func._task_lock_key = lock_key
              if retry is not None:
                  func._task_retry = retry
              if retry_on is not None:
                  func._task_retry_on = retry_on
              if retry_method is not None:
                  func._task_retry_method = retry_method
              if batch is not None:
                  func._task_batch = batch
              if schedule is not None:
                  func._task_schedule = schedule
              if max_queue_size is not None:
                  func._task_max_queue_size = max_queue_size
  
              func.delay = _delay(func)
  
              if schedule is not None:
                  serialized_func = serialize_func_name(func)
                  assert serialized_func not in self.periodic_task_funcs, \
                      "attempted duplicate registration of periodic task"
                  self.periodic_task_funcs[serialized_func] = func
  
              return func
  
          return _wrap if _fn is None else _wrap(_fn)
docs: Function decorator that defines the behavior of the function when it is
          used as a task. To use the default behavior, tasks don't need to be
          decorated.
  
          See README.rst for an explanation of the options.