Скільки паралельних запитів отримує один процес Flask?


138

Я будую додаток за допомогою Flask, але я не знаю багато про WSGI і його базу HTTP, Werkzeug. Коли я починаю подавати Flask-додаток з процесами gunicorn і 4 робочих, чи означає це, що я можу обробляти 4 одночасних запити?

Я маю на увазі паралельні запити, а не запити за секунду чи щось інше.

Відповіді:


183

При запуску сервера розробки - це те, що ви отримуєте, запустивши app.run() , ви отримуєте єдиний синхронний процес, що означає щонайменше 1 запит обробляється за один раз.

Просуваючи Gunicorn перед ним у його конфігурації за замовчуванням та просто збільшуючи кількість --workers, ви отримуєте, по суті, кількість процесів (керованих Gunicorn), кожен з яких веде себе як app.run()сервер розробки. 4 робітники == 4 одночасні запити. Це відбувається тому, що Gunicorn syncза замовчуванням використовує включений тип робітника.

Важливо зазначити, що Гунікорн також включає асинхронних працівників, а саме eventletі gevent(і також tornado, але це найкраще використовується в рамках Торнадо, здається). Вказавши одного з цих асинхронних працівників із --worker-classпрапором, Gunicorn керує низкою асинхронних процесів, кожен з яких керує своєю сукупністю . Ці процеси не використовують потоки, а замість них підпрограми. В основному, в межах кожного процесу одночасно може відбуватися лише 1 річ (1 потік), але об'єкти можна "призупинити", коли вони очікують завершення зовнішніх процесів (подумайте, запити бази даних або очікування мережевого вводу / виводу).

Це означає, що якщо ви використовуєте одного з асинхронних працівників Gunicorn, кожен працівник може одночасно обробляти багато, ніж один запит. Від того, скільки робітників найкраще, залежить від характеру вашого додатка, його оточення, апаратного забезпечення, на якому він працює тощо. Більш детальну інформацію можна знайти на сторінці дизайну Gunicorn та примітках про те, як гевен працює на його вступній сторінці.


4
Gunicorn тепер підтримує "справжні" теми з версії 19. Дивіться це і це .
Філіпе Коррея

2
Як можна відстежувати, які ресурси поділяються (і як), а які повністю розділяються між потоками / процесами? Наприклад, як я впорався б із ситуацією, коли я хочу поділитися величезною структурою даних між декількома процесами, якими обробляється Gunicorn та використовуються в обробниках колби?
Йоганн Петрак

Що ви запитуєте @Johsm - це як запитати, як обмінюватися даними між різними процесами в операційній системі. Відповідь на це може відповісти на ваше запитання, ви повинні використовувати зовнішнє сховище, оскільки процеси не ділять його пам'яттю з іншими процесами. Gunicorn є лише для того, щоб використовувати багатопроцесорні архітектури процесора, але не вирішує ці проблеми.
adkl

Що з Євою? Це стосується і Єви?
Ішвар

2
сервер розробки колб за замовчуванням використовує теми, починаючи з v1.0 ( github.com/pallets/flask/pull/2529 )
hychou

40

В даний час існує набагато простіше рішення, ніж ті, що вже надаються. Під час запуску програми потрібно просто передати threaded=Trueпараметр app.run()виклику, наприклад:

app.run(host="your.host", port=4321, threaded=True)

Інший варіант, згідно з тим, що ми можемо побачити в документах werkzeug , - це використовувати processesпараметр, який отримує число> 1, що вказує максимальну кількість одночасних процесів для обробки:

  • різьблення - чи повинен процес обробляти кожен запит окремим потоком?
  • процеси - якщо більше 1, то обробляйте кожен запит у новому процесі до максимальної кількості одночасних процесів.

Щось на зразок:

app.run(host="your.host", port=4321, processes=3) #up to 3 processes

Більше інформації про run()метод тут , а також повідомлення в блозі, яке привело мене до пошуку рішення та посилань на api.


Примітка: у документах Flask щодо run()методів зазначено, що використання його у виробничому середовищі не рекомендується, оскільки ( цитата ): "Хоча легкий і простий у використанні, вбудований сервер Flask не підходить для виробництва, оскільки він не масштабує добре . "

Однак вони вказують на свою сторінку « Параметри розгортання» для рекомендованих способів зробити це під час виробництва.


5
Дякуємо за інформацію. Важливо зазначити, що документ для запуску заявляє, що його не слід використовувати у виробничому середовищі, заявляючи, що він не відповідає вимогам безпеки або продуктивності.
Coffee_fan

1
@Coffee_fan ви праві. Навіть на останньому 1.1.x вони перешкоджають цьому, а замість цього пропонують перевірити їхню сторінку на « Параметри розгортання» під час виробництва. Включивши у відповідь ваше цінне спостереження :)
DarkCygnus

33

Колба буде одночасно обробляти один запит на потік. Якщо у вас є 2 процеси з 4 потоками кожен, це 8 одночасних запитів.

Колба не породжує і не керує потоками чи процесами. Це відповідальність шлюзу WSGI (наприклад, gunicorn).


9

Ні - ви точно можете впоратися з цим більше.

Важливо пам’ятати, що глибоко в глибині душі, якщо припустити, що ви працюєте з однією основною машиною, процесор дійсно виконує лише одну інструкцію * за один раз.

А саме, процесор може виконувати лише дуже обмежений набір інструкцій, і він не може виконувати більше однієї інструкції за годинник (багато інструкцій займають навіть більше 1 галочки).

Тому найбільша паралельність, про яку ми говоримо в галузі інформатики, - це програмне забезпечення. Іншими словами, існують шари реалізації програмного забезпечення, які абстрагують процесор нижнього рівня від нас і змушують думати, що ми одночасно виконуємо код.

Ці "речі" можуть бути процесами, що представляють собою одиниці коду, які одночасно запускаються в тому сенсі, що кожен процес думає, що він працює у своєму власному світі зі своєю власною загальною пам'яттю.

Інший приклад - це потоки, які є одиницями коду всередині процесів, які також дозволяють одночасно.

Причина, коли ваші 4 робочі процеси зможуть обробити більше 4 запитів, полягає в тому, що вони запускають потоки для обробки все більше запитів.

Фактичний ліміт запиту залежить від обраного HTTP-сервера, вводу / виводу, ОС, обладнання, мережевого підключення тощо.

Удачі!

* інструкції - це основні команди, які може виконувати процесор. приклади - додайте два числа, переходьте з однієї інструкції на іншу


1
Це нерестовина нерестує нитки чи колбу? Я не знайшов жодних доказів, що підтверджували б таку можливість.
jd.

1
Звичайно, я розумію, що це стосується процесів, але відповідь говорить, що більше ниток створюється у міру необхідності. Це те, що я хотів би отримати підтвердження.
jd.

4
"глибоко в глибині душі, якщо припустити, що ви працюєте з одноядерною машиною, процесор дійсно виконує лише одну інструкцію * за один раз" Це не вірно на сучасних машинах. Більшість сучасних процесорів є конвеєрними та суперскалярними , де навіть одне ядро ​​має декілька одиниць виконання та дешифратор інструкцій, який перетворює "машинний код", що бачиться з програмного боку, у фактичні апаратні мікрооперації, що надсилаються до окремих блоків виконання.
Майкл Гірі

1
Для уточнення, ще у той час процесори насправді виконували безпосередньо цифрові вказівки у виконуваному файлі - машинному коді. Кожна посилання на процесор мала графік тимчасових інструкцій, що показує, скільки циклів годин займала кожна інструкція, включаючи будь-які посилання на пам'ять. Таким чином, ви можете просто скласти таймінги, щоб знати, скільки часу займе будь-який фрагмент коду. Сучасні процесори зовсім не такі. Один цікавий виняток - BeagleBone, який має сучасний суперскалічний процесор ARM та два старомодні процесори "PRU" з фіксованими термінами інструкцій.
Майкл Гірі

1
І щоб уточнити, що , кажучи про "сучасне", я використовував це як вільну стенограму для таких процесорів, як мікросхеми ARM / Intel / AMD - конвеєрні, суперскалярні тощо. Звичайно, є також сучасні процесори, які працюють по-старому з фіксованим часом за інструкцію, як-от PRU, про які я згадував, та різні нові мікроконтролери. (А тепер повернемось до Гунікорна!)
Майкл Гірі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.