diff --git a/celery/canvas.py b/celery/canvas.py index f8278c6002..c26312a28c 100644 --- a/celery/canvas.py +++ b/celery/canvas.py @@ -662,8 +662,16 @@ def run(self, args=None, kwargs=None, group_id=None, chord=None, first_task = tasks.pop() options = _prepare_chain_from_options(options, tasks, use_link) - first_task.apply_async(**options) - return results[0] + real_result = first_task.apply_async(**options) + # If we only have a single task, it may be important that we pass + # the real result object rather than the one obtained via freezing. + # e.g. For `GroupResult`s, we need to pass back the result object + # which will actually have its promise fulfilled by the subtasks, + # something that will never occur for the frozen result. + if not tasks: + return real_result + else: + return results[0] def freeze(self, _id=None, group_id=None, chord=None, root_id=None, parent_id=None, group_index=None):