Есть ли способ запустить код инициализации у каждого работника uwsgi (после разветвления) - PullRequest
2 голосов
/ 20 марта 2019

Есть ли способ (в uWSGI или Flask) зарегистрировать функцию, которая будет запускаться у каждого рабочего после нереста, но как можно скорее?

У нас есть приложение для фляги, которое выигрывает от предварительной загрузки нескольких вещей. Следующее вызывает только preload один раз для 8 рабочих процессов. Первый запрос быстрый, но предварительно загруженные объекты используются совместно, что вызывает ошибки.

app = Flask(__name__)
preload()

Если я использую before_first_request , тогда объекты загружаются в каждый рабочий процесс и ошибок нет, но первый запрос очень медленный.

app = Flask(__name__)

@app.before_first_request
def bfr():
    preload()

Я также попытался настроить скрипт фляги. Выполнение команды работает, но очевидно, что объекты загружаются в процессе команды, а не работники uwsgi.

app = Flask(__name__)
manager = Manager(app)

@manager.command
def preload():
    ...

Полагаю, если мы используем before_first_request, мы могли бы вручную инициировать запрос после перезапуска uwsgi. Это единственное решение здесь?

edit: только что нашел опцию uswgi hook-post-fork (и другие опции hook). Я собираюсь попробовать это завтра. Может быть, это то, что мне нужно.

1 Ответ

1 голос
/ 21 марта 2019

Декоратор postfork работал у меня, просто потребовалось немного времени, чтобы найти.

import uwsgidecorators

@uwsgidecorators.postfork
def preload():
    ...
...