Цель этого поста
- Понять, что такое сельдерей
- Создайте простую задачу в проекте Django (сельдерей)
Что такое сельдерей?
Сельдерей – это асинхронный
обработка и Планирование
Инструмент в Джангу (не ограничен django).
Так что такое асинхронный?
Когда клиент отправляет запрос на сервер, обычно клиент ничего не может ничего делать, пока не получает ответ с сервера. То, что сказал, когда запрос – это трудоемкая работа, я имею в виду более 1 минуту, чтобы справиться, Пользователь начнет нажать кнопку «Обновить пару раз» или нажмите на кнопку «Назад».
Чтобы предотвратить эту ситуацию, мы обрабатываем API асинхронно. Асинхронная обработка позволяет клиентам отправлять запросы и немедленно выполнять другие задачи. Когда возвращает ответ, обработка ответа продолжается.
Эта асинхронная обработка осуществляется сельдереем.
Как насчет планирования?
Вы можете сделать задачу, которая работает в 8 часов каждое утро. Или вы также можете отправить электронные письма для пользователей каждую пятницу в 4:00 вечера. Это возможно с избиением сельдерея.
Как работает сельдерей?
Единица работы, с которой сельдерей должен иметь дело, называется задачей. Производитель (сельдерей) создает задачу, и задача добавляется в очередь задач до его выполнения. Затем брокер пересылает задачу в очередь задачи на соответствующий узел работника, который является потребителем (сельдерей), где выполняется задача. Сереререй можно рассматривать как большую концепцию, включая производителя, брокеров и потребитель.
Давайте создадим простую задачу!
Подготовьте проект Django (любой проект в порядке – вы можете просто использовать https://docs.djangoproject.com/en/3.1/intro/tutorial01/ Если вы не знаете, с чего начать)
Установите и запустите rabbitmq. (Я использовал доморожение) Попробуйте https://www.rabbitmq.com/install-homebrew.html. Если у вас еще нет rabbitmq.
Brew Services Начните Rabbitmq
начать rabbitmqУстановите сельдерей в виртуальной среде
Пип Установите сельдерей
Создать новое приложение для сельдерея
Python Manage.py StartApp Djangocelery
<- Вы можете назвать ваше приложение что угодно. Я позвонил моюDjangocelery
Настройки и больше 5-1 Создать
Celery.py
Djangocelery
Приложение (каталог) и добавить следующий код
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'betweak.settings') app = Celery('djangocelery') # You can add celery settings in settings.py starting with CELERY_ app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks(lambda : settings.INSTALLED_APPS)
5-2. Редактировать djangocelery> init .py файл
from .celery import app as celery_app # celery app is automatically imported when django starts __all__ = ['celery_app']
5-3. Редактировать настроек .py
INSTALLED_APPS = [ ... 'celery' 'djangocelery' # newly created app ] # set CELERY settings with CELERY_{} CELERY_BROKER_URL = amqp://guest:guest@localhost:5672/ # rabbitmq setting CELERY_TIMEZONE = 'Asia/Seoul' CELERY_ENABLE_UTC=False CELERY_TASK_SERIALIZER = 'json' CELERY_ACCEPT_CONTENT = ['json']
6 . Миграция базы данных Python Mange.py мигрирует
7 . Создать задание
Создайте файл task.py в djangocelery и добавьте следующий код
from djangocelery.celery import app @app.task(name="mod", bind=True, default_retry_delay=10, max_retries=5) def mod(self, x, y): try: z = x % y print(f'{x} % {y} = {x%y}') return z except : mod.retry() print(f'Error with mod')
8 . Добавить представления, чтобы мы могли получить доступ к задаче с API
Djangocelery> Просмотр
from django.http import HttpResponse from rest_framework.decorators import api_view from djangocelery.tasks import mod @api_view(['GET']) def get_test_add(request): x, y = int(request.query_params.get('x')), int(request.query_params.get('y')) mod.apply_async(args=(x, y), countdown=20) return HttpResponse(f'Success !')
Сельдерея Django> Urls.py
from django.urls import path from djangocelery import views urlpatterns = [ path('mod', views.get_test_add) ]
BetWeak> URLS.PY (URL проекта)
urlpatterns = [ path('celery/', include('djangocelery.urls')), path('admin/', admin.site.urls), ]
ОК, поэтому настройки готовы. Давайте проверим это!
Выпускать сельдерей
Celery – Djangocelery Рабочий работник Loglevel-info
Беги Django (в другом терминале)
Python Manage.py Runserver
Давайте проверим бревно сельдерея, чтобы увидеть, что происходит.
Мы видим, что в 22:32:33 получена задание. Примерно через 20 секунд спустя в 22:32:54 задача преуспела.
Если мы увидим djangocelery> просмотреть.
ffrom djangocelery.tasks import mod @api_view(['GET']) def get_test_add(request): # so we get the x and y values from the url x, y = int(request.query_params.get('x')), int(request.query_params.get('y')) # Here countdown=20 means executes in 20 seconds from now mod.apply_async(args=(x, y), countdown=20) return HttpResponse(f'Success ! ')
Ну, это было легко?
Давайте попробуем ошибку. Мы пройдем 0 значение для y. Python поднимает, когда мы пытаемся использовать 0 для модуля.
Давайте проверим выйти
Там есть много. Мы видим, что был ZerodivisionError, и задача повторилась 5 раз!
Djangocelery> Task.py.
# Here are the settings for retries!! @app.task(name="mod", bind=True, default_retry_delay=10, max_retries=5) def mod(self, x, y): try: z = x % y print(f'{x} % {y} = {x%y}') return z except : mod.retry() print(f'Error with add')
Так что это для того, чтобы начать с сельдереем в Джангу:)
Оригинал: “https://dev.to/daeenchoi/understanding-celery-and-creating-simple-task-in-django-3gdk”