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