Відповіді:
flask.Flask.run
приймає додаткові аргументи ключових слів ( **options
), які він пересилає werkzeug.serving.run_simple
- два з цих аргументів threaded
(булевий) та processes
(який ви можете встановити на число, що перевищує один, щоб werkzeug породив більше одного процесу для обробки запитів).
threaded
за замовчуванням True
у Flask 1.0, тому для останніх версій Flask сервер розробки за замовчуванням зможе одночасно обслуговувати декілька клієнтів. Для старих версій Flask ви можете явно пройти, threaded=True
щоб увімкнути цю поведінку.
Наприклад, ви можете зробити
if __name__ == '__main__':
app.run(threaded=True)
для обробки декількох клієнтів, використовуючи потоки таким чином, що сумісні зі старими версіями Flask, або
if __name__ == '__main__':
app.run(threaded=False, processes=3)
сказати Werkzeug створити три процеси для обробки вхідних запитів, або просто
if __name__ == '__main__':
app.run()
обробляти декілька клієнтів за допомогою потоків, якщо ви знаєте, що будете використовувати Flask 1.0 або новішу версію.
При цьому, Werkzeug serving.run_simple
обгортає стандартний wsgiref
пакет бібліотеки - і цей пакет містить еталонну реалізацію WSGI, а не готовий до виробництва веб-сервер. Якщо ви збираєтеся використовувати Flask у виробництві (якщо припустити, що "виробництво" не є внутрішньодоступним додатком з низьким трафіком, що містить не більше 10 одночасних користувачів), переконайтеся, що він встає за реальний веб-сервер (див. Розділ Документів Flask під назвою Параметри розгортання деяких запропонованих методів).
Використовуючи простий app.run()
зсередини Flask, створюється єдиний синхронний сервер на одному потоці, здатний одночасно обслуговувати лише одного клієнта. Він призначений для використання в контрольованих середовищах з низьким попитом (тобто розробкою, налагодженням) саме з цієї причини.
Нерестові нитки та керування ними самостійно, мабуть, не дадуть вам дуже далеко, через Python GIL .
Однак, у вас є ще хороші варіанти. Gunicorn - це надійний, простий у користуванні сервер WSGI, який дозволить вам нереститися декількома працівниками (окремі процеси, тому GIL не турбується), і навіть постачається з асинхронними працівниками, які прискорять ваш додаток (і роблять його більш безпечним) з невеликим не працювати з вашого боку (особливо з колбою).
Тим не менш, навіть Гунікорн, мабуть, не повинен бути безпосередньо відкритим. У виробництві його слід використовувати за більш надійним сервером HTTP; nginx, як правило, добре поєднується з гунікором і колбою.
gunicorn app:app 127.0.0.1:8080
замість цього python app.py
. Nginx буде виконувати функцію публічної служби, яка відкриває ваш приватний додаток під керуванням Gunicorn (зворотний проксі) , приховуючи всілякі відомості про реалізацію HTTP нижнього рівня, можливо, безпосередньо подає статичні файли тощо.
processes=100
і бути задоволеним цим? У моєму випадку мені потрібні лише статичні файли, а не методи HTTP Post. Моя вимога полягає в тому, що я хочу запустити всі потоки Flask як частину мого батьківського додатку, щоб усі вони могли ділитися змінними.