В службе приложений для бизнес-сценария, где требование своевременности не столь велико, нам не нужно ждать, пока все задачи будут выполнены, прежде чем возвращать результат.Например, в сценарии регистрации пользователя, после сохранения пароля учетной записи пользователя, вы можете вернуться немедленно.Последующие учетные записи Почта активации может обрабатываться в асинхронной форме, которая может быть реализована с использованием службы очереди. В противном случае, если вы дождетесь успешной отправки почты, может пройти несколько секунд.
Что такое сельдерей?
Celery — это служба распределенных очередей, реализованная на языке Python, в дополнение к поддержке мгновенных задач, также поддерживает временные задачи, Celery имеет 5 основных ролей.
Task
Задачи (задача) - это то, что вам нужно что-то сделать, например, процесс регистрации. Есть много задач для пользователей отправлять электронную почту, чтобы убедиться, что задача, эта задача может быть потребляемая для сельдерей для того, чтобы справиться, есть задача Групповая задача, такая как ежедневная ежедневная статистика регистрации статистики, это также может быть передано циклико-процессу сельдерея.
Broker
Брокер в переводе с китайского означает брокер, который относится к лицу, оказывающему посреднические услуги покупателям и продавцам на рынке. В Celery эта роль эквивалентна очереди в структуре данных, посреднику между производителями и потребителями. Например, в веб-системе производитель — это основная программа, которая создает задачи и отправляет задачи брокеру, а потребитель — это рабочий процесс, который представляет собой фоновую службу, предназначенную для выполнения задач. Сам по себе Celery не предоставляет службы очередей, обычно для реализации служб очередей используются Redis или RabbitMQ.
Worker
Worker — это человек, выполняющий задачи в фоновом режиме, а также становящийся потребителем задач, он будет следить за тем, есть ли задачи в очереди в режиме реального времени, и если задачи есть, то они будут вынесены и выполнены немедленно.
Beat
Beat — это планировщик задач по расписанию, который будет отправлять задачи брокеру в соответствии с конфигурацией и ждать, пока воркеры их израсходуют.
Backend
Бэкэнд используется для сохранения результата выполнения задачи. Каждая задача имеет возвращаемое значение. Например, сервис, который отправляет электронное письмо, сообщит нам, было ли оно отправлено успешно или нет. Этот результат хранится в Бэкенде. Конечно, нас не всегда волнует результат выполнения задачи.
Легко понять Celery, запомнив эти 5 символов.
Быстрый старт
Когда дело доходит до знакомства с чем-то новым, нет ничего, чему можно научиться быстрее, чем на самом деле. Предположим, мы выбрали Redis в качестве брокера, вам нужно установить Redis и запустить службу Redis (пожалуйста, используйте поисковую систему, чтобы решить этот шаг самостоятельно)
pip install -U "celery[redis]"
1. Создайте экземпляр сельдерея
# tasks.py
from celery import Celery
app = Celery('tasks', broker='redis://localhost:6379/0')
2. Создайте задачу
Предположим, что эта задача по отправке писем занимает 5 секунд.
# tasks.py
@app.task
def send_mail(email):
print("send mail to ", email)
import time
time.sleep(5)
return "success"
При отсутствии Celery программа выполняется последовательно, и каждый шаг должен ждать завершения выполнения предыдущего шага.
1. 插入记录到数据库
2. 发邮件
3. 注册成功
Мы можем поместить 2 в задачу и передать ее сельдерею для выполнения, поэтому нам не нужно ждать завершения письма, вам просто нужно организовать сельдерей для обработки и помочь мне выполнить ее. код становится
1. 插入记录到数据库
2. celery 帮我去发邮件
3. 注册成功
Второй шаг очень быстрый, нужно только поставить задачу в очередь, а не ждать выполнения задачи. Это имеет прямое отношение к жизни: например, многие из наших дел мы делаем не сами, а менее важные или неотложные дела мы передаем другим для решения.
3. Запустить работника
Запускаем Worker и смотрим есть ли задачи в Broker Команда:celery worker
, вам может потребоваться указать параметры
celery -A tasks worker --loglevel=info
-A: Указать, в каком модуле находится экземпляр celery.В примере экземпляр celery находится в файле tasks.py.После успешного запуска вы можете увидеть информацию
После оформления функции декоратором app.task она станет Task в Celery.
4. Вызов задачи
Позвоните на задачу в основной программе и отправьте задачу брокеру вместо того, чтобы на самом деле выполнять задачу
# user.py
from tasks import send_mail
def register():
import time
start = time.time()
print("1. 插入记录到数据库")
print("2. celery 帮我发邮件")
send_mail.delay("xx@gmail.com")
print("3. 告诉用户注册成功")
print("耗时:%s 秒 " % (time.time() - start))
if __name__ == '__main__':
register()
В главной программе позвоните в функцию.delay
метод
Структура каталога:
── celery_test
├── tasks.py
└── user.py
запустить питонаuser.py, чтобы запустить приложение
1. 插入记录到数据库
2. celery 帮我发邮件
3. 告诉用户注册成功
耗时:0.22688984870910645 秒
Программа выполнилась менее чем за 0,23 секунды, если бы она выполнялась в соответствии с обычной логикой синхронизации, это заняло бы не менее 5 секунд, потому что задача отправки писем занимала 5 секунд.
Просмотр информации журнала в окне службы работника
Уведомление:
1. При запуске celery worker, если это пользователь root, нужно установить переменную окружения:
$ export C_FORCE_ROOT='true'
2. Celery4.x больше не поддерживает платформу Windows, если вам нужно разрабатывать на Windows, используйте версию 3.x.
3. Используйте RabbitMQ или Redis в качестве брокера, никогда не используйте реляционную базу данных в производственной среде.
4. Не используйте сложные объекты в качестве аргументов функций задач
# Good
@app.task
def my_task(user_id):
user = User.objects.get(id=user_id)
print(user.name)
# ...
# Bad
@app.task
def my_task(user):
print(user.name)
# ...
резюме
Чтобы изучить Celery, вам сначала нужно узнать сценарии его применения, затем общие роли в Celery и, наконец, выполнить шаги, чтобы понять, как работает Celery.
Ссылка на ссылку:
Одновременно опубликовать блог:foofish.net