• Главная
  • Контакты
Подписаться:
  • 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

Подписка


ЛУЧШЕЕ

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

Измеритель силы хвата. Когда реально переоценил свою силу +45

09:01

Георгий Герганов, автор llama.cpp и звукового кейлогера +36

04:57

Илон Маск создал новую партию, а Цукерберг продолжает повышать ставки в битве за AI-таланты +20

12:30

Как настроить синхронизацию в Obsidian с помощью S3 +18

11:03

VPS сервер по цене пачки чипсов: обзор самых дешёвых тарифов российских хостеров +18

09:15

Программируем квадрокоптер на STM32 +16

08:00

Новое в контроллерах Bitrix Framework: фильтры и валидация +14

06:45

Интеграция Flutter Mobile SDK в ОС Аврора +13

13:01

Ходим в Интернет с отключённым IPv4 +11

11:10

Почему разработчики не делают «по уму», даже когда знают как +11

08:15

Универсальное языковое приложение. Часть 1: по-фразовый плеер с параллельными текстами и редактор субтитров +9

12:03

Современные подходы «из текста в SQL»: RAG, CoT и другие хитрости +8

12:15

Введение в WebRTC +7

12:11

Квадрат и косые линии: логотипы Антона Станковского +7

12:00

Как Android-разработчик в iOS погружался: мой опыт внедрения Kotlin Multiplatform +7

11:43

Java Digest # 26 +6

10:01

Нейроуловки для изучения английского: как запоминать слова без зубрежки +6

08:41

Странная физика, которая дала жизнь искусственному интеллекту +6

06:58

Портативное железо 2025: подборка новых мини-ноутбуков для работы и отдыха +6

05:15

Автоматизация документации: MkDocs Material + GitLab CI/CD + Битрикс +6

11:30

Я 10 лет искал причину головной боли, оказалось — чипсы +154

09:01

Программирование как разработка теорий: почему senior-разработчики стали ценны как никогда? +106

20:06

VHS-Decode — новый метод оцифровки видео +86

11:15

Мы — не семья: как компании заставляют тебя работать за идею и спасибо +38

19:05

Компьютерные сети для начинающих +33

13:01

Жизнь и смерть Карла Коха: первый хакер на службе КГБ в поисках всемирного заговора и тайны числа 23. Часть 9 — финал +32

08:12

Плотнее, быстрее, дешевле: керамические накопители Cerabyte бросают вызов LTO +30

08:00

От дефицита к ажиотажу: почему DDR4 снова в центре внимания… по тройной цене +22

13:49

Процессор на коленке ч.4. Конвейер +20

06:48

EngEasy.ru — моё приложение английского. Идея, процесс, технологии +19

06:15

Внедрение зависимостей в PHP: от основ до фреймворков +17

20:07

Оптимизация языковой модели Mamba для выполнения на CPU +14

15:00

Почему все ломается, или Зачем менеджеру в ИТ софт-скилы +13

14:05

Вы могли и не знать. Какие проекты делал Хидэо Кодзима помимо Metal Gear Solid и Death Stranding +11

16:43

В ReactOS заключен контракт для улучшения набора тестов +10

13:04

Изобретатель механического светофора: история Гаррета Моргана +10

11:13

Docker + Neovim: поднимаем конфиг на любом сервере и не засоряем систему +8

12:08

Деревья умеют выделять «дождеобразующие» вещества +7

10:40

Как мы подняли современный портал документации из россыпи .md файлов: пошаговое руководство по MkDocs + Material +7

04:15

Собираем комплекс для качественного офлайн-перевода текстов, работающий на самом обычном игровом компьютере +7

09:01

Первые анекдоты о программистах: как выглядел юмор айтишников в 1996-1998 годах? +134

12:55

Лучшие игры легендарной машины: 45 лет назад на свет появилась линейка компьютеров ZX +55

09:56

Датчик утечки воды и не только, просто и почти даром +55

13:01

GPS в городских джунглях: почему навигатор «прыгает» между небоскрёбами +46

14:05

Пишем 3D-игру для ретро-устройств весом в 600Кб… +39

09:44

Как я почти продал ник за $9500 в Telegram +35

08:04

Deepin 25: китайский дистрибутив Linux с ИИ и обновленным DDE +25

10:16

Как сделать любую поверхность сенсорной +23

08:05

О мягких и жёстких ссылках в Linux +22

00:00

Оптимизация индексов базы данных: проблемы, решения, практические рекомендации +22

07:34

Продаешь крипту через P2P? Налоговая может потребовать 6% со всего оборота +16

08:02

Лучшие нейросети для создания игр +15

13:50

PHP и Laravel дайджест новостей за июнь 2025 года +12

12:00

История создания процессора ARM: от амбициозного проекта до сердца цифровой революции +12

08:00

Алгоритм релакса: как пазлы помогают сконцентрироваться на сложных задачах и не выгореть +12

09:16

SOLID, DRY, KISS, YAGNI и др. принципы разработки, пугающие новичка в IT +11

07:00

Покажи свой стартап/пет-проект (июль) +9

06:38

Система позиционирования и фиксации дрона на посадочном столе +8

10:35

Часть 2: Создание пользовательского интерфейса на дисплее Guition с ESPHome и библиотекой LVGL +7

09:56

Скриншот-тестирование фронтенда: руководство по применению в 2025 году +6

ОБСУЖДАЕМОЕ

  • Тебе не поступить на программиста. Всё кончено -14

    • 401   103000

    Я 10 лет искал причину головной боли, оказалось — чипсы +154

    • 328   26000

    Первые анекдоты о программистах: как выглядел юмор айтишников в 1996-1998 годах? +134

    • 184   50000

    Датчик утечки воды и не только, просто и почти даром +55

    • 98   25000

    VHS-Decode — новый метод оцифровки видео +88

    • 90   7600

    От PHP к Zig: как я избавился от костылей в биллинг-системе -1

    • 83   5000

    Лучшие игры легендарной машины: 45 лет назад на свет появилась линейка компьютеров ZX +55

    • 78   13000

    Метафизика мнимой единицы -7

    • 73   3500

    Программирование как разработка теорий: почему senior-разработчики стали ценны как никогда? +106

    • 63   19000

    Покажи свой стартап/пет-проект (июль) +9

    • 40   2700

    Как я почти продал ник за $9500 в Telegram +35

    • 39   9200

    Компьютерные сети для начинающих +35

    • 36   13000

    Мы — не семья: как компании заставляют тебя работать за идею и спасибо +38

    • 34   7400

    Почему ваш ИИ превращается в ваше эхо: Гипотеза архитектурного слияния и как с этим бороться +5

    • 33   837

    EngEasy.ru — моё приложение английского. Идея, процесс, технологии +19

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