2025, Dec 10 12:02
Как избежать блокировки вебхуков в Flask с threaded=True
Почему длительная операция в обработчике вебхука Flask блокирует запросы и как запустить dev‑сервер с threaded=True для параллельной обработки без блокировок.
При создании локальной конечной точки вебхука на Flask часто всплывает одна и та же сложность: обработчику нужно выполнить длительную операцию — например, обратиться к удалённому API. Пока этот вызов «в пути», не хочется, чтобы процесс перестал слушать новые вебхуки. Вопрос в том, как сохранить отзывчивость эндпоинта, не меняя ядро приложения.
Постановка задачи
Ниже — минимальный пример вебхука, принимающего POST‑запросы. Внутри обработчика вызывается затратная функция, которая может занять обработку запросов целиком.
from flask import Flask, request, abort
svc = Flask(__name__)
@svc.route("/", methods=["POST"])
def intake():
if request.method == "POST":
slow_operation()
Опасение очевидно: пока обработчик занят, будут ли последующие запросы обрабатываться или они выстроятся в очередь за длительной задачей?
Почему это блокирует
Длительная задача внутри обработчика запроса может помешать процессу принимать новые запросы, если сервер не умеет запускать несколько обработчиков одновременно. Если в каждый момент времени работает лишь один, эндпоинт будет «зависать», пока не завершится медленный участок.
Решение
Запустите встроенный dev‑сервер Flask с включённой многопоточностью. Если передать run параметр threaded=True, встроенный сервер сможет обслуживать несколько запросов параллельно, и медленный обработчик не будет блокировать следующий входящий вебхук.
from flask import Flask, request, abort
svc = Flask(__name__)
@svc.route("/", methods=["POST"])
def intake():
if request.method == "POST":
slow_operation()
if __name__ == "__main__":
svc.run(threaded=True)
Так слушатель вебхуков остаётся отзывчивым, пока длительный код выполняется.
Почему это важно
Вебхуки часто приходят пачками. Если один медленный вызов «заберёт» обработку, вы рискуете потерять отзывчивость именно в критический момент. Параллельная обработка гарантирует, что приложение продолжит принимать и обслуживать новые запросы, пока текущая работа ещё выполняется. Учтите, что запуск встроенного сервера через app.run не предназначен для продакшна. Продакшен‑серверы будут многопоточными.
Выводы
Если ваш вебхук на Flask выполняет длительную операцию, запускайте dev‑сервер с threaded=True, чтобы не блокировать эндпоинт. Этот небольшой флаг позволяет обслуживать несколько запросов одновременно и сохраняет отзывчивость локального слушателя. В продакшне используйте многопоточную серверную конфигурацию вместо встроенного dev‑сервера.