Чи можу я обслуговувати декілька клієнтів, використовуючи лише Flask app.run () як окремий?


201

Я знаю, що я можу зв’язати Flask з Apache або іншими веб-серверами. Але я думав запускати Flask як окремий сервер, що обслуговує декілька клієнтів одночасно.

Чи можливо це? Чи потрібно обробляти нерест кількох ниток та керувати ними?

Відповіді:


295

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 під назвою Параметри розгортання деяких запропонованих методів).


2
Що робити, якщо я переглядаю максимум 100 користувачів? Чи можу я просто призначити processes=100і бути задоволеним цим? У моєму випадку мені потрібні лише статичні файли, а не методи HTTP Post. Моя вимога полягає в тому, що я хочу запустити всі потоки Flask як частину мого батьківського додатку, щоб усі вони могли ділитися змінними.
ATOzTOA

4
Чаклес - @ATOzTOA - ні, це, мабуть, буде досить контрпродуктивним (процеси відносно дорогі, і якщо ви не працюєте багато в кожному запиті, немає причин, чому 4 або 8 процесів не повинно бути недостатньо). Це означає, що якщо ви показуєте лише статичний вміст, вам буде краще з сервером, оптимізованим для цього (Apache, ngnix, IIS).
Шон Віейра

2
Крім того, вам не потрібно часто ділитися змінними між запитами - якщо вам це доведеться, вам або потрібно буде обмежитися одним процесом, або використовувати деякий позадіапазонний зв’язок (Redis, база даних, файлова система тощо), так що кожен із ваших процесів залишається синхронізованим.
Шон Віейра

3
@ATOzTOA - якщо ти не зможеш запустити кращий сервер, я б просто закрутився і подивився, що станеться. Якщо він не працює добре під навантаженням, його можна розгорнути за іншим веб-сервером.
Шон Віейра

2
@ATOzTOA, стосовно вашого питання про те, чому ви не можете одночасно вказати "потоку" та "процеси", див. Тут код: werkzeug.readthedocs.org/en/latest/_modules/werkzeug/serving
pyrho

62

Використовуючи простий app.run()зсередини Flask, створюється єдиний синхронний сервер на одному потоці, здатний одночасно обслуговувати лише одного клієнта. Він призначений для використання в контрольованих середовищах з низьким попитом (тобто розробкою, налагодженням) саме з цієї причини.

Нерестові нитки та керування ними самостійно, мабуть, не дадуть вам дуже далеко, через Python GIL .

Однак, у вас є ще хороші варіанти. Gunicorn - це надійний, простий у користуванні сервер WSGI, який дозволить вам нереститися декількома працівниками (окремі процеси, тому GIL не турбується), і навіть постачається з асинхронними працівниками, які прискорять ваш додаток (і роблять його більш безпечним) з невеликим не працювати з вашого боку (особливо з колбою).

Тим не менш, навіть Гунікорн, мабуть, не повинен бути безпосередньо відкритим. У виробництві його слід використовувати за більш надійним сервером HTTP; nginx, як правило, добре поєднується з гунікором і колбою.


17
не зовсім. Гунікорн - пітон, нінгікс - ні. це не те, як ви б їх використали. Gunicorn дозволить вам запускати додаток gunicorn app:app 127.0.0.1:8080замість цього python app.py. Nginx буде виконувати функцію публічної служби, яка відкриває ваш приватний додаток під керуванням Gunicorn (зворотний проксі) , приховуючи всілякі відомості про реалізацію HTTP нижнього рівня, можливо, безпосередньо подає статичні файли тощо.
Райан Артекона

Колба з app.run (з потоком = True) працює дуже добре на Apache2, використовуючи mod_wsgi flask.palletsprojects.com/en/1.1.x/deploying/mod_wsgi
MortenB
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.