Бенчмарк¶
akadze против двух других очередей задач на Postgres для Python, на одной машине и одном Postgres. Скрипт — bench/compare.py; прежде чем верить цифрам с чужого ноутбука, запустите его сами.
Условия¶
- PostgreSQL 16 в Docker, хост 12 CPU / 15 ГБ, Python 3.13, клиент на том же хосте.
- akadze
mainпосле 0.6.0 (с пробуждением при освобождении слота), PgQueuer 1.6.0, Procrastinate 3.10.0. - Каждой библиотеке — своя чистая база. Задания — пустые async-функции: измеряется очередь, а не работа.
- Один процесс воркера, 20 заданий одновременно: akadze
Worker(slots=20)с пулом на 25 соединений (почему) иpoll_intervalпо умолчанию; PgQueuerbatch_size=10, max_concurrent_tasks=20; Procrastinateconcurrency=20. PgQueuer и Procrastinate здесь опрашивают базу каждые 50 мс, чаще, чем по умолчанию. - Медиана 3 прогонов.
Результаты¶
| akadze | PgQueuer | Procrastinate | |
|---|---|---|---|
| Поставить 10 000 заданий одним пакетом | 0,10 с | 0,16 с | 0,37 с |
| Поставить 1 000 заданий, каждое в своей транзакции | 4,2 с | 3,1 с | 3,5 с |
| Выполнить 10 000 заданий из очереди | 19,6 с | 8,5 с | 70 с |
| Заданий в секунду при выполнении | ~510 | ~1 170 | ~140 |
Как читать¶
- Пакетная постановка быстрее всего в akadze:
enqueue_manyпишет по тысяче строк на запрос. - Выполнение примерно в 2,3 раза медленнее, чем у PgQueuer. Каждый запуск в akadze перечитывает свою строку перед стартом (fencing против rescue), записывает исход в своей транзакции с хуками и идёт через SQLAlchemy; PgQueuer забирает и завершает задания пачками через asyncpg напрямую. Пропускная способность одного воркера — сегодняшняя цена этих гарантий и следующее место для улучшений.
- Цифры — для пустых заданий. Задание, которое 200 мс ждёт ответа API, ограничивает 20 слотов сотней заданий в секунду, и собственные накладные расходы очереди там весят гораздо меньше.
- Что не измерялось: лимиты, fair claim (см. Как работает claim), несколько воркеров, сетевая задержка до базы.
Запуск:
pip install -r bench/requirements.txt
BENCH_DSN=postgresql://user:pass@localhost:5432 python bench/compare.py 3
BENCH_N, BENCH_M и BENCH_CONCURRENCY меняют число заданий и параллельность. Скрипт удаляет и создаёт свои базы.