Разница между разными способами создания задачи сельдерея

Я очень смущен, глядя на разные способы создания задачи сельдерея. На первый взгляд все они работают одинаково Итак, может ли кто-нибудь объяснить, в чем разница между ними.

1.

from myproject.tasks import app

@app.task
def foo():
    pass

2.

from celery import task

@task
def foo():
    pass

3.

from celery import shared_task

@shared_task
def foo():
    pass

Немного погуглив, я знаю, что разница между 1-м и 3-м shared_task используется, когда у вас нет конкретного экземпляра приложения. Может ли кто-нибудь подробнее рассказать об этом и когда используется второй?


person MOntu    schedule 03.02.2019    source источник
comment
Меня смущает №1, где в проекте вы это пишете? это также может быть from proj.celery import app, если вы следуете docs.celeryproject.org /ru/стабильный/джанго/   -  person dangel    schedule 15.05.2020


Ответы (1)


Не используйте #2, если вы не используете celery v3. Если вы используете сельдерей v4, используйте #1.

Используйте № 3 в тех случаях, когда вы пишете повторно используемую библиотеку или приложение django. Например, если вы пишете набор задач с открытым исходным кодом, который позволяет вам управлять экземплярами aws ec2 с помощью celery, вы должны использовать shared_task, чтобы задачи можно было запускать на celery, но вы предоставили бы человеку, использующему вашу библиотеку, возможность настроить сельдерей под себя.

Используйте #1, если вы пишете для своего собственного проекта и не беспокоитесь о повторном использовании.

person 2ps    schedule 04.02.2019
comment
второй метод специфичен только для сельдерея v3? что, если мы используем в v4? И есть ли разница между 1-м и 2-м? Они точно такие же, за исключением того, что они зависят от версии сельдерея? - person MOntu; 04.02.2019
comment
Насколько я понимаю, да, вторая версия специфична только для v3 и не должна использоваться с v4. Между № 1 и № 2 есть разница, но это потому, что v4 принципиально отличается от v3. В версии 4 использование декоратора фактически регистрирует задачу как выполнимую для любого рабочего процесса, запущенного с этим экземпляром приложения. Я не думаю, что в v3 есть подобная концепция. - person 2ps; 05.02.2019
comment
Мы используем метод № 2 для объявления всех задач в приложении Django 1.11 с использованием Celery 4.3.0, и все работает, как и ожидалось. Даже последние документы Celery, кажется, используют его взаимозаменяемо docs.celeryproject.org/ ru/v5.0.5/userguide/tasks.html. Есть ли у вас какие-либо конкретные источники об устаревании или изменениях в функциональности? - person tmarice; 11.01.2021