让芹菜等待任务完成

用户11684966

我希望 celery 等待特定任务完成,因此我在 celery 本身旁边安装了 celery-results-backend。但我不明白我必须如何编写任务调用才能等待,因为我目前收到以下错误:

example_task() missing 1 required positional argument: 'user_pk'

视图.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)

在我的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)

我也收到一个错误:

* 后的 example_task() 参数必须是可迭代的,而不是 UUID

感谢这里的任何建议。

丹尼斯-亚历山德鲁·尼卡

首先,你用apply_async()错了。该函数接受你的任务的参数打包为一个元组(参数)和字典(kwargs)所看到这里这是因为您可以指定定义任务运行方式的附加参数。另一方面,delay() 只接受你的任务的 args 和 kwargsdelay()大多数情况下就足够了。

你可以这样做:

 example_taks.apply_async(kwargs={"user_pk":user.pk})

或这个:

example_tasks.delay(user_pk=user.pk)

您也可以使用位置参数,但我建议尽可能使用 kwargs。

其次,一旦提交就等待异步任务违背了 Celery 的目的。要等待任务完成,您需要对结果调用get()

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章