我希望 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 和 kwargs。delay()
大多数情况下就足够了。
你可以这样做:
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] 删除。
我来说两句