Воркер был мне нужен для процессинга операций от пользователя на файловой системе. Это загрузка новой картинки, удаление старой, копирование из одного места в другое. Все эти операции могут исполняться параллельно, но только с одной записью за раз. В pg есть таблица со списком команд на исполнение.
Флоу работы такой:
1. Выгрести из таблицы 10 команд через select for update skip locked.
2. Посмотреть id записей для которых эти команды написаны. Попытаться взять лок в pg на эти id через pg_locks.
3. Если удалось взять блокировку, сделать 10 корутин и запустить их внутри task group для параллельного исполнения.
4. Внутри есть process pull executor, в который можно засунуть CPU-bound задачи.
5. По завершению мы отпускаем локи на записи.
6. Если несколько команд работало с одним и тем же postgres large object, он остаётся жить до тех пор, пока не завершится последняя команда которой он нужен.
В итоге пользователь приходит на сайт, загружает несколько картинок. Они сохраняются в pg large object. Для каждой делается задача на сохранение на диск и вот этот воркер или несколько таких воркеров их процессят. В воркере ограничение на 5 процессов, так что 5 штук жмутся параллельно для каждого инстанса воркера (пока один, но скоро будут два).
СообщениеВоркер был мне нужен для процессинга операций от пользователя на файловой системе. Это загрузка новой картинки, удаление…
26 июня 2026Рядом в ленте
Иэто сообщение
И