FoxmindEd Birthday 🥳: -20% на усі курси менторингу та навчання на проєкті до 22.07.2024!
Дізнатися більше
11.01.2024
12 хвилин читання

Асинхронність і Celery в Python

Celery що це і яку роль він виконує у світі розробки? Про це ми розповімо в сьогоднішньому матеріалі.

Celery – це інструмент, який виконує завдання в асинхронному режимі в Python-додатках. Іншими словами, програма виступає в ролі посередника, забезпечуючи паралельне виконання операцій, не забираючи при цьому цінні ресурси основного потоку виконання.

Вперше її було випущено 2009 року, і відтоді вона стала одним із найпопулярніших інструментів для асинхронного опрацювання завдань у Python. Використовується в широкому спектрі проєктів, від невеликих веб-додатків до великих корпоративних систем. Важливим моментом в історії цієї програми є її здатність ефективно впроваджуватися в різноманітні проекти, надаючи програмістам можливість зосередитися на розв’язанні конкретних завдань, а не на організації асинхронного виконання. Поєднання гнучкості, стабільності та активної підтримки зробило її незамінним інструментом для розробників.

Нагадаємо, що якщо ви тільки починаєте свій шлях у програмуванні або бажаєте розширити свій набір навичок, зверніть увагу на два практичні курси: “Python для початківців” (https://foxminded.ua/python-1/) і “Python з нуля” (https://foxminded.ua/python-start-1/) від компанії FoxmindEd.

Основні концепції та архітектура 

  • Worker – це процес або потік, який фактично виконує завдання. Він підключається до брокера (broker) і очікує надходження завдань для виконання. Воркер приймає завдання з черги та обробляє їх асинхронно.
  • Broker – це посередник між відправником завдань і виконавцем (робочим, воркером). Він приймає завдання від відправника, зберігає їх у черзі та передає робітникам для виконання. Популярні брокери – RabbitMQ і Redis. Ефективна робота брокера – ключова для координації завдань і розподіленої обробки.
  • Task – являє собою асинхронну операцію, яку необхідно виконати. Це може бути виклик функції, виконання певного коду або інші типи роботи. Завдання (таски) визначаються в коді додатка і відправляються на виконання Celery.
Наш курс Python Start призначений для тих, хто тільки починає вивчати цю мову. Тут ти отримаєш міцні базові знання та зможеш впевнено рухатися далі!
Початкові вимоги
Вільне володіння комп’ютером
Вміння читати англійською мовою
Більше про курс

Архітектура Celery створена для того, щоб обробляти завдання децентралізовано. Це означає, що система може масштабуватися горизонтально, додаючи робочі одиниці за потреби. Також вона надає можливість створювати кілька черг, що надає гнучкості в управлінні різними типами завдань. Розробники ж можуть ефективно організовувати та структурувати завдання залежно від їхнього пріоритету та типу.

Завдяки своїй розподіленій природі, система може легко адаптуватися до високих навантажень і забезпечувати надійне виконання завдань. За необхідності можна додавати нових брокерів і робітників, що робить систему більш масштабованою і стійкою.

Встановлення та налаштування 

Щоб встановити програму, ви можете використовувати менеджер пакетів pip:

Після встановлення вам необхідно налаштувати брокер повідомлень. Найпопулярнішими є RabbitMQ і Redis.

Для налаштування RabbitMQ, використовуйте конфігураційний файл:

Вибір брокера залежить від вимог проєкту та інфраструктури. Переконайтеся, що брокер правильно налаштований, щоб Celery міг ефективно обробляти ваші завдання.

Створення та виконання завдань 

Як же визначити завдання і налаштувати їх виконання в Celery?

  1. У вашому файлі із завданнями (tasks.py), визначте функції, які будуть виконуватися асинхронно. Використовуйте декоратор @app.task для вказівки, що це завдання Celery.
  1. В основному коді вашого застосунку, де потрібно виконати завдання, імпортуйте функцію і викликайте її, використовуючи метод .delay():

Метод .delay() відправляє завдання брокеру для асинхронного виконання.

Наведемо приклади коду для створення простих і періодичних завдань…

Просте завдання (виконують найпростіші математичні операції):

Celery дає змогу також виконувати завдання за розкладом. Періодичне завдання:

Якщо ж це налаштування періодичного виконання, то:

Тут crontab(minute=0, hour=0) означає, що завдання буде виконуватися щопівночі.

Ці приклади демонструють базові кроки з визначення та запуску завдань у Celery. Важливо пам’ятати, що асинхронні завдання полегшують обробку великовагових операцій без блокування основного потоку виконання вашої програми.

Моніторинг і управління завданнями

Програма надає кілька інструментів і технік для ефективного моніторингу завдань і працівників.

  • Flower: це веб-інтерфейс для моніторингу та управління Celery. Він надає графіки та статистику виконання завдань, а також дає змогу динамічно керувати чергами та працівниками через веб-інтерфейс.
  • Метрики та логи: ви можете інтегрувати програму з інструментами моніторингу, такими як Prometheus і Grafana, щоб візуалізувати й аналізувати метрики. Логування також відіграє важливу роль у відстеженні дій ваших завдань і працівників.

Celery також надає кілька можливостей для управління завданнями. Розглянемо їх:

  • Скасування завдань: якщо завдання довге або необхідно скасувати його виконання, програма надає механізм скасування завдань. Під час створення завдання можна отримати його ідентифікатор, який потім може бути використаний для його скасування.
  • Повторення завдань: якщо завдання завершилося з помилкою або потрібно повторити його виконання, відбувається його перезапуск. Це можна зробити, передаючи ті ж самі аргументи, які використовувалися під час початкового запуску.
  • Логування: це полегшує відстеження виконання завдань і виявлення можливих проблем. Логи можна налаштувати для запису в різні джерела, такі як файли, консоль або централізовані системи логування.

Ці інструменти та техніки дають змогу ефективно моніторити виконання завдань і працівників Celery, а також керувати завданнями залежно від потреб проєкту.

Просунуте використання 

Celery надає широкий спектр можливостей для просунутого використання. Ось деякі з них:

  • Маршрутизація завдань – дає змогу відправляти завдання на певні робочі процеси, що особливо корисно у випадках, коли деякі завдання потребують спеціалізованих ресурсів або обробки. Наприклад, ви можете спрямувати завдання на обробку зображень певному набору робочих процесів, що володіють потрібними ресурсами.
  • Цепочки завдань – дають змогу визначити послідовність завдань, де результат одного завдання стає вхідними даними для наступного. Це полегшує структурування складних операцій, розбиваючи їх на більш дрібні та керовані завдання.
  • Чережі – надають механізм для організації та управління завданнями, що корисно в сценаріях з різними пріоритетами або типами завдань. Наприклад, завдання з високим пріоритетом можуть бути поміщені в окрему чергу для більш швидкого виконання.
What is Celery

Celery можна інтегрувати з іншими сервісами та фреймворками. Це може бути корисно для розширення її можливостей або для її інтеграції з наявними системами. Наприклад:

  • RabbitMQ: використовується для обробки складних сценаріїв.
  • Redis: хороший для швидкого і простого впровадження
  • Django: може бути інтегрований для асинхронної обробки завдань веб-додатків.
  • Flask: використовується для обробки фонових завдань у Flask-додатку.

Найкращі практики та оптимізація

Щоб забезпечити максимальну продуктивність і надійність Celery, рекомендується дотримуватися рекомендацій:

  • Використовуйте ефективний брокер повідомлень.
  • Оптимізуйте код завдань.
  • Використовуйте пули робочих процесів.
  • Використовуйте моніторинг і управління.

Під час роботи з програмою можуть виникнути такі проблеми:

  • Продуктивність: робота програми може бути повільною, якщо не використовувати ефективний брокер повідомлень та оптимізований код завдань, а також – пули робочих процесів.
  • Надійність: Celery може бути ненадійним, якщо не використовувати пули робочих процесів і не проводити моніторинг та управління.
  • Безпека: можуть бути питання і з безпекою, якщо не використовувати її правильні налаштування.
Підпишіться на наш Ютуб-канал! Корисні відео для програмістів чекають на вас! YouTube
Оберіть свій курс програмування! Шлях до кар’єри програміста починається тут! Подивитись

Приклади з реального життя та кейс-стаді

У веб-додатках, таких як SaaS сервіси, часто виникають завдання, які мають бути виконані в певний час або за розкладом. Наприклад, надсилання користувачеві нагадування, завершення пробного періоду акаунта або автоматична публікація постів у соціальних мережах.

У Celery існує можливість вказати параметр ETA при виклику завдання, який визначає час запуску завдання. Однак, при плануванні завдань таким чином, існує деяка ненадійність, оскільки завдання можуть не запуститися або стати важкоскасованими.

Яке ж тоді тут рішення?

Більш надійний і зручний підхід полягає у використанні розкладу celerybeat. Це дає змогу створити розклад, що містить завдання, які виконуються з певною періодичністю або в конкретний час.

Наприклад, завдання для автоматичної публікації постів у соціальних мережах може запускатися щохвилини, тоді як завдання завершення пробного періоду акаунта може бути заплановане на щоденне виконання.

Таким чином, Celery в сукупності з celerybeat забезпечує надійне й ефективне виконання завдань за розкладом у веб-додатках на Django.

Висновок

Як бачимо, Celery відіграє ключову роль у забезпеченні асинхронного опрацювання завдань у світі Python. Вона є потужним інструментом, який може значно поліпшити продуктивність і чуйність додатків. Відповідно, її вивчення та правильне використання може бути корисним для будь-якого розробника Python, який хоче створювати високопродуктивні та масштабовані додатки.

FAQ
Що таке Celery і для чого його використовують?

Celery - це асинхронна черга завдань, що використовується для розподіленої обробки повідомлень. Він дає змогу виконувати завдання у фоновому режимі, не завантажуючи основний потік виконання.

Які мови програмування підтримує Celery?

Celery переважно використовується з Python, хоча існують способи інтеграції з іншими мовами програмування.

Чи можна використовувати Celery в мікросервісній архітектурі?

Так, Celery добре підходить для мікросервісних архітектур, оскільки він може допомогти в організації асинхронного опрацювання завдань між різними сервісами.

Чи потрібен спеціальний брокер повідомлень для роботи з Celery?

Так, для роботи Celery потрібен брокер повідомлень, такий як RabbitMQ або Redis, для передавання повідомлень між екземплярами Celery.

Чи можна масштабувати Celery?

Так, Celery легко масштабується, даючи змогу додавати додаткові робочі вузли для обробки більшої кількості завдань.

Чи використовується Celery тільки для завдань, пов'язаних із веб-розробкою?

Ні, Celery можна використовувати в різних сценаріях, не обмежуючись лише веб-розробкою. Він підходить для будь-яких завдань, що вимагають асинхронної обробки.

💡 Вдалося розібратися як працює Celery? Поділися в коментарях!

Додати коментар

Ваш імейл не буде опубліковано. Обов'язкові поля відзначені *

Зберегти моє ім'я, імейл та адресу сайту у цьому браузері для майбутніх коментарів