Django 让芹菜等待任务完成

Django 让芹菜等待任务完成,django,task,celery,Django,Task,Celery,我希望芹菜等待一个特定的任务完成,因此我在芹菜本身旁边安装了芹菜结果后端。但我不明白如何编写任务调用才能等待,因为我当前遇到以下错误: example_task() missing 1 required positional argument: 'user_pk' views.py def example(request): user = request.user if request.method == 'GET': result = example_taks

我希望芹菜等待一个特定的任务完成,因此我在芹菜本身旁边安装了芹菜结果后端。但我不明白如何编写任务调用才能等待,因为我当前遇到以下错误:

example_task() missing 1 required positional argument: 'user_pk'
views.py

def example(request):
    user = request.user
    if request.method == 'GET':
        result = example_taks.apply_async(user_pk=user.pk)
        result_output = result.wait(timeout=None, interval=0.5)
        return redirect('something')
    else:
        args = {'user': user}
        return redirect(reverse('something'), args)
在my tasks.py上:

def example_task(user_pk):
    user = User.objects.get(pk=user_pk)
    try:
       ...
以前我是这样称呼这次会谈的:

def example(request):
    user = request.user
    if request.method == 'GET':
    example_task.delay(request.user.pk)
    ...
这是工作正常,但并没有等待任务完成

如果我这样做:

result = allocate_new_bch_address.apply_async(request.user.pk)
我还得到一个错误:

*后面的示例_task()参数必须是iterable,而不是UUID


感谢这里的建议。

首先,您使用的
apply\u async()
错误。如图所示,该函数接受任务的参数,并将其打包为元组(args)和字典(kwargs)。这是因为您可以指定其他参数来定义任务的运行方式。另一方面,
delay()
<代码>延迟()在大多数情况下都足够了

您可以这样做:

 example_taks.apply_async(kwargs={"user_pk":user.pk})
或者这个:

example_tasks.delay(user_pk=user.pk)
您也可以使用位置参数,但我建议尽可能使用kwargs

第二,一提交异步任务就等待它,这违背了芹菜的目的。要等待任务完成,您需要调用结果:

result = example_tasks.apply_async(kwargs={"user_pk":user.pk})
result_output = result.get()

如果你在等待任务完成,为什么还要用芹菜呢?直接在视图中运行该方法会更好。这可能会完全扼杀我使用K8S进行应用程序扩展的想法。只需增加django工人的数量,而不是芹菜工人的数量?这可能不是一个好主意。如果您有一个大型应用程序,您可能不希望使用相同的容器处理您的任务,因为它们已经在处理用户请求,除此之外,您将无法设置web实例数或芹菜工作者实例数。我不喜欢这个主意,sry。我们可以关注这个问题吗?等待任务完成将占用django的一名员工,因为它将被阻止,直到任务完成…切换到gunicorn生产服务器后,您的sugestion semms将导致以下错误:有想法吗?