"s()"和"si()"在 Django 中无法正常工作吗?



我在Django的tasks.py中有add()任务,如下所示*我在Windows 11:上的django中使用Celery 5.2.7django-Celery结果

# "store/tasks.py"
from celery import shared_task
@shared_task
def add(x, y): # Here
return x + y

然后,我在views.py中的test()中调用了add.delay(3, 4),如下所示:

# "store/views.py"
from .tasks import add
from django.http import HttpResponse
def test(request):
add.delay(3, 4) # Here
return HttpResponse("Test")

然后,我可以正确地得到以下结果:

Task store.tasks.add[...] succeeded in 0.06s: 7 # Here

但是,当在test()中调用add.s(3, 4)add.si(3, 4)时,如下所示,没有显示任何内容:

# "store/views.py"
from .tasks import add
from django.http import HttpResponse
def test(request):
add.s(3, 4) # Here
add.si(3, 4) # Here
return HttpResponse("Test")

那么,s()si()在Django中不能正常工作吗?

.s(…)方法[celecer-doc]创建签名:它基本上是一个带有数据的对象,用于指定要调用的函数和参数。但是,它不会调度任务,也不会在方法本身中对其进行评估。

至于.si()[celecer-doc]也创建了一个签名,但它是不可变的。

您可以安排任务,例如:

from django.http import HttpResponse
from .tasks import add

def test(request):
add.s(3, 4).apply_async()
add.si(3, 4).apply_async()
return HttpResponse('Test')

但是,这不会返回结果,而是返回一个任务。您可以等待这些任务返回,或者例如将任务处理程序保存在数据库中。

因此,它将把任务添加到队列中,最终一个工作人员将拾取并评估它

最新更新