Фон Итак, сегодня я буду говорить об альтернативе Celery под названием , которая гораздо проще в настройке, чем и намного меньше по размеру по сравнению с Celery. Huey Celery, Причина, по которой я решил попробовать Huey, заключается в том, что иногда я сталкивался с некоторыми проблемами с Celery при выполнении некоторых общих задач, поскольку документация не слишком хороша. Для тех, кто не знает, что такое Celery, или не использовал его раньше, Huey — это асинхронная очередь задач, которая позволяет выполнять запланированные задачи или длительные задачи в фоновом режиме. Предварительные условия Мы будем устанавливать следующие пакеты: Redis Джанго Хьюи запросы (необязательно, нужны для демо) Репозиторий GitHub Следующий блог сопровождается репозиторием GitHub, который вы можете использовать для тестирования демонстрационного проекта, который мы будем создавать. Нажмите здесь, чтобы просмотреть репо. Настройка проекта Создайте каталог проекта Откройте терминал и введите следующее, чтобы создать каталог; вы можете пропустить этот шаг и сделать это из самого проводника. mkdir huey_demo Виртуальная среда Давайте сначала создадим virtualenv для установки зависимостей нашего проекта: python -m venv venv Активируйте virtualenv (Linux): source venv/bin/activate Установка зависимостей Введите следующую команду в терминале, чтобы установить все зависимости: pip install Django==4.0.4 redis==4.2.2 huey==2.4.3 На момент написания этой статьи это были версии, с которыми я тестировал эту настройку, следите за репозиторием Github на предмет любых обновлений в соответствии с последней версией в будущем. Создать проект Создайте проект Django, введя в терминале следующую команду: django-admin startproject django_huey_demo Измените каталог на каталог проекта Django: cd django_huey_demo Создайте приложение в рамках нашего проекта: python manage.py startapp demo Включите созданное приложение в проект , внесите следующие изменения: settings.py INSTALLED_APPS = [ # Existing Apps "demo.apps.DemoConfig", # <== Add this line ] Установите для режима отладки значение в : False settings.py DEBUG=False Мы устанавливаем для Debug значение False, чтобы мы могли видеть, как Huey работает в рабочей среде, подробнее об этом позже. Обзор проекта Теперь, когда мы закончили настройку нашего проекта, самое время рассказать вам о том, что мы будем строить сегодня. Мы будем ежедневно получать «Слово дня» из . Затем мы сохраним слово, его определение и пример слова в предложении в нашей базе данных. Wordnik API Мы создадим периодическую задачу с помощью Huey, которая будет получать «Слово дня» и сохранять его. Для хранения слова мы создадим его модель Django. Получение API-ключа Wordnik Вы можете следовать , чтобы получить ключ API. этому руководству Кодирование нашего проекта Добавьте Хьюи в наш проект Нам нужно добавить Хьюи в установленные приложения нашего проекта, поэтому внесите следующие изменения в файл : settings.py INSTALLED_APPS = [ # Existing apps 'huey.contrib.djhuey', # <== Add this line ] Установить Редис Нам нужно установить Redis для Huey, чтобы хранить в нем информацию о задачах в очереди, как мы это делали с Celery. Вы можете перейти по следующей , чтобы установить Redis в зависимости от вашей конкретной операционной системы. ссылке Если вам удобно использовать Docker, вы можете использовать следующую команду: docker run --name redis_huey -p 6379:6379 -d redis По умолчанию Хьюи попытается подключиться к серверу Redis, работающему на . Если его нет, это вызовет ошибку. localhost:6379 Определение модели Добавьте следующий код в файл : demo/models.py from django.db import models class Word(models.Model): word = models.CharField(max_length=200) part_of_speech = models.CharField(max_length=100) definition = models.TextField() example = models.TextField() def __str__(self): return self.word Сделайте миграцию: python manage.py makemigrations demo Примените миграции: python manage.py migrate demo Определение задачи Создайте файл с именем в каталоге демонстрационного приложения. Причина, по которой мы назвали наш файл заключается в том, чтобы помочь Хьюи автоматически обнаруживать задачи, присутствующие в наших зарегистрированных приложениях. Если бы мы назвали наш файл иначе, нам пришлось бы вручную зарегистрировать нашу задачу. Если вы хотите узнать больше, вы можете ознакомиться с документацией Хьюи . tasks.py tasks.py здесь Прежде чем писать определение задачи, нам необходимо установить дополнительные зависимостей. Установите его, набрав в терминале следующее: requests pip install requests==2.27.1 Теперь идет код: import requests from django.conf import settings from huey import crontab from huey.contrib.djhuey import db_periodic_task from demo.models import Word @db_periodic_task(crontab(hour="18", minute="00")) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] ) Добавьте следующую строку в настройки вашего проекта: WORDNIK_API_KEY = "api-key-here" Этот блок кода может оказаться очень сложным для понимания, поэтому давайте рассмотрим его поочередно: Хьюи Декоратор from huey.contrib.djhuey import db_periodic_task Это декоратор, предоставляемый Huey для регистрации периодических задач, связанных с работой с базой данных. Этот декоратор автоматически закрывает соединение с базой данных после завершения задачи. Более подробную информацию можно найти здесь. Расписание Кронтаба @db_periodic_task(crontab(hour="18", minute="00")) Мы передаем аргумент нашему декоратору периодической задачи, это говорит Хьюи запускать нашу задачу в 18:00 каждый день. Вы можете использовать для создания расписаний crontab, я использую его каждый раз. crontab(hour="18", minute="00") этот веб-сайт Ключ API Wordnik from django.conf import settings # Usage ## settings.WORDNIK_API_KEY — это стандартный способ импорта любых данных из настроек нашего проекта. Это полезно в тех случаях, когда у нас есть несколько файлов настроек, настроенных для разных сред, поэтому он будет знать, какой файл выбрать, и нам не придется беспокоиться об этом. это. Он определяет, какой файл настроек мы используем, из переменной среды . Но вам не нужно беспокоиться об этих деталях. from django.conf import settings DJANGO_SETTINGS_MODULE Затем мы используем ключ в нашем вызове API Wordnik. Вызов API Wordnik r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") Здесь мы используем модуль запросов для отправки запроса GET к API Wordnik, передавая наш ключ API для аутентификации. Хранение слова в базе данных data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] ) После анализа ответа API мы сохраняем определение слова в нашей базе данных. Здесь мы используем метод вместо метода , чтобы не создавать несколько копий одного и того же слова в нашей базе данных, если это слово когда-либо повторяется API Wordnik. get_or_create create Ответ API Wordnik Вот как выглядит ответ API Wordnik для конечной точки Word of the Day. Некоторые из нерелевантных разделов ответа были сокращены в целях краткости. { "word": "stolon", "definitions": [ { "source": "ahd-5", "text": "A long thin stem that usually grows horizontally along the ground and produces roots and shoots at widely spaced nodes, as in a strawberry plant.", "note": null, "partOfSpeech": "noun" }, // More definitions here... ], "publishDate": "2022-05-08T03:00:00.000Z", "examples": [ { "title": "4.1 Nursery establishment", "text": "A stolon is a stem that grows along the ground, producing at its nodes new plants with roots and upright stems.", // Additional data here... }, // More examples here... ], // Additional fields here... } Бегущий Хьюи Рабочий Вы можете запустить рабочий Huey, введя в терминале следующую команду: python manage.py run_huey Вы можете передать несколько флагов приведенной выше команде, которая изменит то, что регистрируется на консоли, например: — подробное журналирование (включая уровень DEBUG) -v, --verbose — минимальное журналирование -q, --quiet — простой формат логирования («сообщение времени») -S, --simple Чтобы просмотреть различные другие варианты ведения журнала, ознакомьтесь с документацией . здесь Что еще ты можешь сделать с Хьюи? Декораторы задач Huey поставляется с несколькими декораторами задач в зависимости от того, какие операции вы выполняете внутри задачи. Ниже я кратко объясню, что все это делает. Вот оператор импорта для всех декораторов: from huey.contrib.djhuey import task, periodic_task, db_task, db_periodic_task : обычная задача. task : если вы хотите периодически запускать задачу по расписанию. periodic_task : если вы хотите выполнять операции с БД в рамках своей задачи. db_task : если вы хотите выполнять операции с БД в рамках периодической задачи. db_periodic_task Примеры кронтаба Позвольте мне показать вам еще несколько примеров того, как вы можете использовать crontab для планирования задач. запланирует выполнение задачи каждые три минуты. crontab(minute='*/3') создаст задачу, которая будет запускаться через 5 минут каждого третьего часа. crontab(hour='*/3', minute='5') создаст задачу, которая будет запускаться каждый 5-й день недели каждого 2-го месяца в 10:00 УТРА. crontab(minute='00', hour='10', month='*/2', day_of_week='*/5') Планирование задач Например, у вас есть следующая задача, определенная внутри : tasks.py from huey.contrib.djhuey import task @task() def count(): for i in range(10): print(i) Теперь, если вы хотите вызвать эту задачу, но хотите, чтобы она запускалась через 5 секунд, вы можете сделать следующее: count.schedule(delay=5) Параметр принимает значения в секундах, поэтому, если вы хотите, чтобы он выполнялся через 5 минут, укажите 300 секунд. delay Повторная попытка выполнения неудачных задач Предположим, вы добавите следующую логику в нашу существующую задачу: @db_periodic_task(crontab(hour="18", minute="00"), retries=2) def fetch_daily_word(): r = requests.get( f"https://api.wordnik.com/v4/words.json/wordOfTheDay?api_key={settings.WORDNIK_API_KEY}") if r.status_code != 200: raise Exception("Unable to fetch data from Wordnik API") ## Add this logic else: data = r.json() Word.objects.get_or_create( word=data["word"], part_of_speech=data["definitions"][0]["partOfSpeech"], definition=data["definitions"][0]["text"], example=data["examples"][0]["text"] ) Итак, мы добавили логику для проверки кода состояния ответа, и если он отличается от 200, задача будет повторяться до двух раз. Но эти повторные попытки будут происходить без какого-либо временного разрыва между двумя попытками. А что, если вы хотите отложить несколько попыток выполнения этой задачи? Мы можем сделать это, передав аргумент , он принимает значения в секундах. retry_delay @db_periodic_task(crontab(hour="18", minute="00"), retries=2, retry_delay=10) Это приведет к 10-секундной задержке между несколькими попытками. Режим разработки Хьюи поставляется с настройками по умолчанию, что упрощает работу с Хьюи во время разработки в Django. Таким образом, всякий раз, когда в вашем файле присутствует , задачи будут выполняться синхронно, как и обычные вызовы функций. Целью этого является избежание запуска как Redis, так и дополнительного потребительского процесса во время разработки или выполнения тестов. Подробнее об этом можно прочитать . settings.py DEBUG=True здесь Для этого нам нужно добавить следующую строку в : settings.py HUEY = {} Однако, если вы хотите переопределить это поведение, вы можете вместо этого добавить следующую конфигурацию Хьюи: HUEY = { "immediate": False } Если у вас есть вышеуказанная конфигурация, указанная в , и , Huey потребует от вас настроить Redis и запустить Huey Worker с помощью команды . settings.py DEBUG=True run_huey Сельдерей против Хьюи Некоторые наблюдения о Хьюи по сравнению с Сельдереем: Меньший объем зависимостей по сравнению с Celery. Вместе с ним Celery устанавливает комбу и бильярд. Между тем, у Хьюи нет никаких зависимостей. Меньшие службы необходимо запускать для периодических задач, Celery требует запуска службы Beat и рабочей службы для работы с периодическими задачами, в то время как нам нужно запустить только одну службу с помощью команды . run_huey Рекомендации Хьюи Документы Вордник API Связанный репозиторий Github