让芹菜等待任务完成



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

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)

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() argument after * must be an iterable, not UUID

首先,您使用了错误的apply_async()。该函数接受任务的参数,这些参数打包为元组(args(和字典(kwargs(,如图所示。这是因为您可以指定其他参数来定义任务应该如何运行。另一方面,delay()只接受任务的args和kwargs。CCD_ 3在大多数情况下是足够的。

你可以这样做:

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()

这就是等待结果的方式。

result = example_tasks.apply_async(kwargs={"user_pk": user.pk})
# Do some other things while celery is running with the task
# Sync up with the task
result.wait(timeout=10) # seconds
if result.result == 1:
print("Do something")

相关内容

  • 没有找到相关文章

最新更新