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

Подписка


ЛУЧШЕЕ

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

ЭВМ в народном хозяйстве: лампы, кибернетика, «Урал-1» +19

10:53

Как троттлинг процессора ломает видеокарту через PCIe: хроники абсурда в сервисном центре DNS +19

09:01

Вот бы вернуть те старые неказистые форумы +19

06:40

Старый трансивер эфир не испортит. Часть 3. Умощняемся +19

11:09

Галлюцинации: почему LLM «тупеют» от «умных» промптов +12

13:30

Тегеран, 1978: Диско бессмертно +10

05:52

Книга среднего уровня — 1 +9

08:31

Чума оказалась очень древней. Что произошло в Сибири 5 500 лет назад +8

12:05

Гибель богов. Fable и ещё 10 LLM реорганизуют код. Сравнение +7

08:47

Действительно богатые сообщения в Telegram-ботах: разбираем Rich Messages +7

08:16

Библиография тоже умеет галлюцинировать: что изменилось после защиты диплома +7

13:01

Популярные ИИ фото через нейросеть: трендовые изображения и ТОП-12 AI сервисов +6

12:38

350 тысяч за вакансию: сколько на самом деле стоит нанять человека в 2026 году +6

11:30

Очередной выпуск гонзо-научпопа из сердца Анд. Поговорим о сукцессии +6

13:10

Съездили к ByteDance и Z.ai: роботы по паспорту, серверные карты на рынке и восемь дней внутри китайского AI +5

13:00

Unreal Engine 6 на Verse — это что-то крышесносное +5

12:07

Делаем свое фото мультяшным нейросетью — промпты для ТОП-8 ИИ для стилизации в 2D и 3D +5

09:00

ИИ добрался до раритетов: цены на память DDR2 взлетели на 60% за три месяца +5

10:49

Игровой момент: история и интеллектуальная собственность Roblox +4

13:43

Модель почтовых адресов в реляционных БД +3

08:00

«Иностранные холодные кошельки» — или нами когда-нибудь перестанут управлять идиоты? +89

23:14

Taskbar с живыми превью работающих приложений (олдскул на NET11) +34

08:15

Сэнди Петерсен и Джон Кармак: как Quake сломал id Software +33

13:19

Носители данных — «игра на выбывание» (2026.07) +29

17:37

Используем старый Mikrotik как сигнализацию +28

08:30

5 новых одноплатников лета 2026 года: x86, Snapdragon и сменные процессоры +24

09:01

«Из ниоткуда в Грецию» и похищенный врач: что стояло за волной сообщений о странных дирижаблях в США 1890-х годов? +23

10:03

Телефон из 1999 года: Alcatel One Touch Pocket. Что внутри? +22

13:02

Самодельная электрогитара: тонируем деку и подгоняем к ней гриф +21

13:05

Подземный гигант: зачем Швейцария строит самую мощную батарею в мире +19

11:50

USB-ключ для ввода TOTP-кодов и сохранённого пароля +15

18:05

Игра проигравшего +13

12:55

Различие между научной гипотезой, теорией и законом +13

09:05

Пока все ждут GTA. Вспоминаем, что ещё делала Rockstar и удивляемся некоторым наименованиям +13

16:52

Переоценённый король +12

14:07

«Уэбб» обнаружил новый сюрприз в ранней Вселенной: зрелое скопление галактик +12

08:27

От игры за $999 до симулятора автобуса: самые странные проекты в истории Steam +12

18:53

Как я обучил русский RAG‑сплиттер, который режет документы по индексам, а не по тексту +11

17:04

Иллюзия безопасности или как ваши сотрудники прямо сейчас обучают конкурентов +11

09:16

Нужен ли здесь `useEffect`? 12 сценариев из React-код-ревью — от производного состояния до React 19.2 +11

04:00

B4 — сетевой мультитул по обходу блокировок +116

14:40

АВК-6: Персональный Аналоговый Компьютер +93

14:33

Как ИИ и очереди на заправках повлияли на появление нового социального феномена +65

07:25

PowerHTML +60

07:01

Несложные ходовые вакуумметры. Часть 1. Манометры сопротивления (Пирани) +47

15:00

Симулятор восприятия: три секунды побыть тем, кто не видит вашу кнопку +42

07:30

Почему интервью для разрабов — такое непроходимое говно, и что с этим делать? +40

11:55

Как я запустил перцептрон на обычном непрограммируемом калькуляторе Casio +38

13:02

Паттерны доступа к данным, которые выбесят ваш процессор +37

22:52

ставим 6 прoкси в 2 клика за 5 минут на 1 VPS +35

09:01

Практическое руководство по аудиту беспроводных сетей (Wi-Fi) на промышленных объектах и складах +33

07:05

От пламени прошлого — до сверхсовременных дальнобойных фонарей: история света, часть-2 +29

09:00

T-Shaped специалист: эволюция или ловушка современного IT? +24

10:14

Запускаем LLM локально на майнинг ферме из 4 GPU +23

09:27

Agent Driven SDLC: как меняется разработка в эпоху ИИ +23

09:27

Agent Driven SDLC: как меняется разработка в эпоху ИИ +23

15:00

Новинка: «Инженерия данных. Паттерны проектирования» +21

11:35

Все внедрили AI. Почти никто им не пользуется. Разбор самого массового вранья года +20

08:00

Почему мощных видеокарт недостаточно для ИИ +20

14:22

Сапборд с мотором и немного о гидродинамике +15

ОБСУЖДАЕМОЕ

  • Как ИИ и очереди на заправках повлияли на появление нового социального феномена +65

    • 263   47000

    «Иностранные холодные кошельки» — или нами когда-нибудь перестанут управлять идиоты? +89

    • 111   21000

    АВК-6: Персональный Аналоговый Компьютер +93

    • 56   16000

    B4 — сетевой мультитул по обходу блокировок +116

    • 56   45000

    Подземный гигант: зачем Швейцария строит самую мощную батарею в мире +19

    • 44   12000

    Как троттлинг процессора ломает видеокарту через PCIe: хроники абсурда в сервисном центре DNS +19

    • 40   7300

    ставим 6 прoкси в 2 клика за 5 минут на 1 VPS +35

    • 38   21000

    JetBrains IDE: будущее не за горами +8

    • 36   15000

    Хватит винить HR: почему «плохие рекрутёры» — самый удобный, но неверный ответ на кризис найма +3

    • 35   5000

    PowerHTML +60

    • 35   9900

    Taskbar с живыми превью работающих приложений (олдскул на NET11) +34

    • 29   13000

    HTTP получил метод QUERY: зачем понадобился безопасный запрос с телом +10

    • 28   11000

    Запускаем LLM локально на майнинг ферме из 4 GPU +23

    • 28   11000

    Почему интервью для разрабов — такое непроходимое говно, и что с этим делать? +40

    • 27   12000

    Игра проигравшего +13

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