Разве "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')

Однако это не вернет результат, а вернет задачу. Вы можете подождать, пока эти задачи вернутся, или, например, сохранить обработчик задачи в базе данных.

Таким образом, он добавит задание в очередь, и в конечном итоге рабочий возьмет его и оценит.

Вернуться на верх