diff --git a/README.md b/README.md index d57320d..4617fce 100644 --- a/README.md +++ b/README.md @@ -228,6 +228,11 @@ These let you tweak the default behavior. Most often, you'll just be setting the `cache_duration` to enable result caching. +#### always_start_new_herd + +Skip herd avoidance check if True, but still trigger avoidance for other tasks. +Defaults to False. + #### cache_duration If you want your results cached, diff --git a/jobtastic/task.py b/jobtastic/task.py index edcb814..6b91df3 100644 --- a/jobtastic/task.py +++ b/jobtastic/task.py @@ -82,6 +82,7 @@ class JobtasticTask(Task): front-end code so that users know what to expect. """ abstract = True + always_start_new_herd = False #: The shared cache used for locking and thundering herd protection _cache = None @@ -222,7 +223,20 @@ def apply_async(self, args, kwargs, **options): task_id = self.cache.get('herd:%s' % cache_key) if task_id: logging.info('Found existing in-progress task: %s', task_id) - return self.AsyncResult(task_id) + result = self.AsyncResult(task_id) + if not self.always_start_new_herd: + return result + if not result.ready(): + logging.info( + 'Revoking in-progress task and starting new herd: %s', + task_id, + ) + result.revoke() + else: + logging.info( + 'Ignoring in-progress task and starting new herd: %s', + task_id, + ) # It's not cached and it's not already running. Use an atomic lock to # start the task, ensuring there isn't a race condition that could