Разве "s()" и "si()" не работают правильно в Django?
У меня есть add()
задача в tasks.py
в Django, как показано ниже. * Я использую Celery 5.2.7 и django-celery-results в Django на Windows 11:
# "store/tasks.py"
from celery import shared_task
@shared_task
def add(x, y): # Here
return x + y
Затем, я вызвал add.delay(3, 4)
в test()
в views.py
, как показано ниже:
# "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
Но при вызове add.s(3, 4)
и add.si(3, 4)
в test()
, как показано ниже, ничего не отображалось:
# "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(…)
[celery-doc] создает сигнатуру: по сути, это объект с данными для указания, какую функцию вызывать и с какими параметрами. Однако он не планирует задание и не оценивает его в самом методе.
Что касается .si()
[celery-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')
Однако это не вернет результат, а вернет задачу. Вы можете подождать, пока эти задачи вернутся, или, например, сохранить обработчик задачи в базе данных.
Таким образом, он добавит задание в очередь, и в конечном итоге рабочий возьмет его и оценит.