code: def enqueue(self, function, name=None, times=1, data=None):
          
          self._check_if_ready()
          return self.main_loop.enqueue(function, name, times, data)
docs: Appends a function to the queue for execution. The times argument
          specifies the number of attempts if the function raises an exception.
          If the name argument is None it defaults to whatever id(function)
          returns.
  
          :type  function: callable
          :param function: The function that is executed.
          :type  name: str
          :param name: Stored in Job.name.
          :type  times: int
          :param times: The maximum number of attempts.
          :type  data: object
          :param data: Optional data to store in Job.data.
          :rtype:  int
          :return: The id of the new job.