• Главная
  • Контакты
Подписаться:
  • Twitter
  • Facebook
  • RSS
  • VK
  • PushAll
logo

logo

  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • За год
    • Положительные
    • Отрицательные
  • Сортировка
    • По дате (возр)
    • По дате (убыв)
    • По рейтингу (возр)
    • По рейтингу (убыв)
    • По комментам (возр)
    • По комментам (убыв)
    • По просмотрам (возр)
    • По просмотрам (убыв)
Главная
  • Все
    • Положительные
    • Отрицательные
  • За сегодня
    • Положительные
    • Отрицательные
  • За вчера
    • Положительные
    • Отрицательные
  • За 3 дня
    • Положительные
    • Отрицательные
  • За неделю
    • Положительные
    • Отрицательные
  • За месяц
    • Положительные
    • Отрицательные
  • Главная
  • The uWSGI Spooler

The uWSGI Spooler +26

24.04.2017 08:30
VyacheslavAkhmetov 4 3300 Источник
Python*, Блог компании Селектел


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


Самой популярной системой очередей в Python является Celery, она обладает широким набором возможностей по управлению задачами. К сожалению, системы на базе Celery сложно поддерживать в работоспособном состоянии, и когда что-то идёт не так, то найти проблему бывает весьма не просто. Можете спросить любого девопса об опыте работы с Celery, но будьте готовы услышать не очень приятные слова.


К счастью, есть альтернативное решение — uWSGI Spooler, и в этой статье я расскажу о нём подробнее.



Основным отличием от Celery является то, что не нужно использовать дополнительные компоненты (сам Celery и хранилище, например Redis), таким образом количество точек отказа уменьшается на две. В качестве хранилища задач может использоваться директория, внешняя директория или сетевой пул.


Для управления Python программами мы часто используем uWSGI. Почему? Потому что он прост в настройке, надежен, гибок и выполняет большинство требований.


Кроме обслуживания Python-кода в виде обеспечения непрерывного доступа к web-приложению, в uWSGI входит компонент Spooler, который реализует систему очередей. Spooler имеет некоторые особенности, а документация по нему достаточно скудна.


Использовать uWSGI Spooler просто, как раз-два-три! Но есть несколько нюансов.
Модуль uwsgi нельзя импортировать из кода, а соответственно тестировать из консоли код не получится, необходимо каждый раз запускать uwsgi воркера, для чего необходимо создать конфиг:


[uwsgi]
socket = /var/run/mysite.sock 
master = True
processes = 4
project_dir = /home/myuser/mysite
chdir = %(project_dir)
spooler = /var/uwsgi_spools/mysite_spool
spooler-import = path.to.spool.package # (package to import spool file)
spooler-frequency = 10 # Frequency for scanning spool
max-requests = 5000
module = wsgi:application
touch-reload = wsgi.py

Файл воркера:


from uwsgidecorators import spool, uwsgi

@spool
def my_func(args):
    print(args)
    # do some job

Постановка задачи из вашего кода:


import uwsgi_spools.mysite_spool as mysite_spool

mysite_spool.my_func.spool(test=True)

Как можно убедиться из примера, порог вхождения для использования очень низкий.


Внутри таска доступен один аргумент, который содержит словарь с тремя служебными ключами (имя функции ud_spool_func, имя таска spooler_task_name, статус таска ud_spool_ret) и всеми параметрами, что были переданы при создании таска, в примере это ключ test.


Таск может вернуть три статуса:


  • -2 (SPOOL_OK) – таск выполнен, будет удалён из очереди;
  • -1 (SPOOL_RETRY) – что-то пошло не так, таск будет повторно вызван;
  • 0 (SPOOL_IGNORE) – игнорировать таск.

Все прочие значения будут интерпретированы как -1 (SPOOL_RETRY).


Особенность: декоратор @spool выполняется единожды (возвращает SPOOL_OK), если функция не упала с исключением.
Для того чтобы управлять жизненным циклом нужно использовать @spoolraw.


Особые ключи (вспомогательные) при создании таска:


  • spooler — абсолютный путь к спулеру, который будет выполнять задачу;
  • at — unix time, когда задача должна быть выполнена (правильнее сказать, она не будет выполнена ранее этого значения);
  • priority — указывает на подпапку в папке задач (на такую подпапку можно выделить большее количество воркеров), через --spooler-ordered можно настроить приоритеты;
  • body — этот ключ используется для значений более 64 КБ, в задачу будет доступен в сериализованном виде.

Кроме декоратора @spool доступен декоратор @timer, который принимает количество секунд в качестве аргумента и позволяет выполнять декорируемую функцию с указанным интервалом.


@timer(30)
def my_func(args):
    print(args)
    # do some job every 30 sec

Аналогично @timer есть декоратор @spoolforever, который будет повторно запускать выполнение функции (завершение задачи со статусом SPOOL_RETRY).


@spoolforever
def my_func(args):
    print(args)
    # do some job and repeat

Для настройки воркеров для работы по сети, нужно добавить адрес, по которому он будет доступен в ini-файл:


socket = 127.0.0.1:10001

При создании задачи указывать адрес получателя задачи:


uwsgi.send_message(“127.0.0.1:10001”, 17, 0, test=True, 5)
# или
uwsgi.spool(test=True, spooler=“127.0.0.1:10001”)

Таким образом, uWSGI Spooler можно использовать как замену очередям, но если всё же не хватает возможностей или хочется немного сахара, то можно использовать uwsgi-tasks, который реализует недостающее.

Поделиться с друзьями
-->

Комментарии (4)


  1. crazylh
    24.04.2017 20:20
    #10189156
    +1

    >К сожалению, системы на базе Celery сложно поддерживать в работоспособном состоянии, и когда что-то идёт не так, то найти проблему бывает весьма не просто.

    А вы уверены, что говорите именно про проблемы продукта, а не очереди, поверх которой бежит Celery (rabbitmq/redis/mongo)


    1. rusnasonov
      27.04.2017 11:15
      #10193584

      Сам celery достаточно сложный продукт. Много абстракций, много возможностей. Чтобы понять его изнутри надо продраться сквозь все эти абстракции.


  1. Satevg
    24.04.2017 21:33
    #10189264

    но если всё же не хватает возможностей


    Из статьи создается ощущение того, что все с Spooler «ровно-гладко, замените Celery, захочете еще»,
    И все же какие есть различия с Celery кроме описанных выше, нюансы в продакшене?


  1. foldr
    27.04.2017 11:15
    #10193590

    А можно по-подробнее, о каких проблемах с Celery идет речь? Сам участвую в проекте с Celery не так давно, но пока не возникало желания его выкинуть и заменить на что-то другое

МЕТКИ

  • Хабы
  • Теги

Python

Блог компании Селектел

spooler

uWSGI

система очередей

СЕРВИСЫ
  • logo

    CloudLogs.ru - Облачное логирование

    • Храните логи вашего сервиса или приложения в облаке. Удобно просматривайте и анализируйте их.
Все публикации автора
  • The uWSGI Spooler +26

    • 24.04.2017 08:30

    Vscale: облачные серверы +25

    • 17.08.2015 10:48

Подписка


ЛУЧШЕЕ

  • Сегодня
  • Вчера
  • Позавчера
07:05

Как ИИ помогает лже-риелторам врать эффективнее +20

07:00

Из котельной — в Ад: Doom на ПЛК +17

07:00

Пять нестандартных мини-ПК: от складной клавиатуры с экраном до ПК-стика с N150 +13

07:47

Возвращение легенды. Второе дыхание списанного IBM ThinkPad T40 +10

05:54

Все лгут: почему не стоит слепо доверять данным в Prometheus и что важно учитывать при их интерпретации +7

07:00

Изоляция и лимитирование пользователей хостинга с ОС «МСВСфера Сервер» 9 редакция для хостинг-провайдеров +5

08:14

Chonkie: революция в RAG-чанкинге — скорость, лёгкость, удобство +4

07:32

Вся фантастика и фентези — про людей +4

01:29

Django 6.0: Ключевые функции, критические изменения +4

06:47

Рецензия на книгу: Изучаем eBPF: программирование ядра Linux для улучшения безопасности, сетевых функций и наблюдаемости +3

08:05

ЕС1851: стресс-тест процессора Intel 80386SX-16 в XXI веке +2

07:33

Тень в кадре, свет в логах: как логи видеорегистратора помогли восстановить последовательность событий +2

07:26

Как я искал работу бэкенд разработчика с одним годом опыта. Мысли, эмоции, статистика +2

06:28

Анализ вакансий ИТ в Москве: системное администрирование, 2025г +2

04:59

Модуль обработки и коммутации данных, с внешними управляющими устройствами по RS-485 на STM32 +2

08:00

Как сокращение полных путей файлов в логах влияет на производительность и размер Браузера +1

07:27

Слёзы, баги и C++: как Isaac стал легендарной игрой +1

07:00

Не отходя от кассы: создание робота-водомерки прямо на воде +1

07:00

Много спрашиваю и откладываю встречи на последний момент: мой опыт прохождения собеседований +1

06:44

Мечтают ли облачные крепостные об облачных феодах +1

14:17

Патчим Chrome для работы с YouTube +106

10:11

По итогам Chaos Constructions'2025 +52

13:05

DigiPi: универсальный цифровой модем радиолюбителя +37

08:03

Как я сделал робота — что хотел и что получилось. Часть 2 +36

09:01

Мой список вопросов о CSS для собеседования в 2025 году +33

10:00

Как я горел от 3D-печати +27

09:47

QEMU: как организовать прозрачное взаимодействие с I2C-устройствами +23

09:23

Когда файл — это тайник: как скрывают данные в изображениях, DNS-запросах и эмодзи +22

13:01

Безопасность VDS: чек-лист по базовой защите +21

08:11

Шесть способов учиться новому максимально быстро и эффективно +20

08:05

Эволюция языков программирования +18

20:12

Цвет настроения синий — история BSOD и палитра экранов смерти +17

08:39

Какие пасхалки скрывают платы наших устройств +17

10:08

std::simd: шаблоны векторизации без intrinsics в C++ +13

13:31

3 скрипта для диагностики Вашего Linux-сервера +12

11:24

Как мы захотели контролировать SPILL’ы в Greenplum и сделали «Демократизатор» +12

07:01

Грабли на проектах: как справляться с неизбежностью ошибок +12

13:45

Неклассическое чтение для руководителей: разбор научных статей по открытым стратегиям и корпоративному open source +11

18:34

Плагины на C# без рантайма: NativeAOT-экспорт и вызов из Rust/Python +10

15:37

Денежная ловушка или эксплуатация BAC биллинга +10

13:01

Отвлекать разработчиков ПО намного вреднее, чем считает большинство менеджеров +92

10:41

Асинхронность vs. многопоточность: что выживет в эпоху No GIL? +54

17:26

Сам себе breakpoint +53

14:04

Я беру проволоку, навиваю, запекаю и зарабатываю 13 млн за год +52

09:01

Pasta e basta! Как паста и макароны стали национальным блюдом Италии и покорили Россию и США? Часть 3 +51

07:00

Воскресная барахолка под Валенсией: винтажная аудиотехника, ноутбуки и много чего ещё +50

07:28

WiFi, который не ловил +48

16:13

Наше расследование: pulp fiction +40

05:04

Шатдаун правительства США, а также Грокипедия от Илона Маска +35

09:00

Психология худшего выбора. Почему с возрастом человек выбирает невежество, даже когда осознает свое решение? +26

08:34

Kandinsky Image научился генерировать изображения с надписями на русском +26

08:05

ИИ в образовании. Учить или учиться +26

21:15

О сути здравого смысла и применимости его в искусственном интеллекте +25

11:55

У меня нет рта, но я должен выводить эмодзи морского конька +23

09:30

Пятьдесят оттенков отказа: стоп слово — Zonal Shift +23

13:00

Возрождение Windows 7: почему ее популярность внезапно выросла +22

16:09

Как вычислить плохого работодателя перед собеседованием? Базовая проверка +21

18:56

Прямоугольные телескопы смогут найти Землю 2.0 +18

06:17

От LPT_Print до IaC: Хроника Эволюции Системных Администраторов в России. Наша 25-летняя «Одиссея» +18

11:17

Java Digest #29 +17

ОБСУЖДАЕМОЕ

  • Психология худшего выбора. Почему с возрастом человек выбирает невежество, даже когда осознает свое решение? +26

    • 131   87000

    Я беру проволоку, навиваю, запекаю и зарабатываю 13 млн за год +52

    • 119   103000

    Отвлекать разработчиков ПО намного вреднее, чем считает большинство менеджеров +92

    • 76   21000

    Асинхронность vs. многопоточность: что выживет в эпоху No GIL? +54

    • 65   11000

    Как вычислить плохого работодателя перед собеседованием? Базовая проверка +21

    • 64   39000

    Патчим Chrome для работы с YouTube +114

    • 50   34000

    «Оставайтесь в жопе» или про негативные убеждения о работе в 6-ти частях +10

    • 47   22000

    Тише едешь — дальше будешь: почему новомодные Agile-методологии уступают подходам прошлого века +12

    • 47   7500

    О сути здравого смысла и применимости его в искусственном интеллекте +25

    • 42   6500

    Мой список вопросов о CSS для собеседования в 2025 году +33

    • 41   5400

    Как я научил Telegram-бота говорить о постах ДПС в реальном времени -8

    • 39   4400

    WiFi, который не ловил +48

    • 37   8900

    Возрождение Windows 7: почему ее популярность внезапно выросла +22

    • 34   11000

    У меня нет рта, но я должен выводить эмодзи морского конька +23

    • 31   5200

    Дом в облаке, которое твое: запускаем личный сервер на UmbrelOS с полным шифрованием +7

    • 31   4900
  • Главная
  • Контакты
© 2025. Все публикации принадлежат авторам.