Python, Flask: Может ли Flask обрабатывать миллион пользователей, таких как Facebook, Google или Twitter? [Дубликат]

def ncustom_zip(seq1,seq2,max_length):
        length= len(seq1) if len(seq1)>len(seq2) else len(seq2) if max_length else len(seq1) if len(seq1)<len(seq2) else len(seq2)
        for i in range(length):
                x= seq1[i] if len(seq1)>i else None  
                y= seq2[i] if len(seq2)>i else None
                yield x,y


l=[12,2,3,9]
p=[89,8,92,5,7]

for i,j in ncustom_zip(l,p,True):
        print i,j
for i,j in ncustom_zip(l,p,False):
        print i,j
80
задан Carson 7 June 2012 в 20:12
поделиться

4 ответа

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

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

Важно отметить, что Gunicorn также включает асинхронных рабочих, а именно eventlet и gevent (а также tornado, но это лучше всего использовать с каркасом Tornado). Указав один из этих асинхронных рабочих с флагом --worker-class, вы получаете Gunicorn, управляющий несколькими асинхронными процессами, , каждый из которых управляет своим собственным параллелизмом. Эти процессы не используют потоки, а вместо них - сопрограммы. В принципе, в каждом процессе все еще может происходить только одна вещь за один раз (1 поток), но объекты могут быть «приостановлены», когда они ждут завершения внешних процессов (думайте о запросах базы данных или ожидая ввода / вывода в сети).

Это означает, что если вы используете одного из асинхронных рабочих Gunicorn, каждый рабочий может обрабатывать не более одного запроса одновременно. Просто, сколько работников лучше всего зависит от характера вашего приложения, его окружения, аппаратного обеспечения, на котором оно работает, и т. Д. Более подробную информацию можно найти на странице дизайна Gunicorn и о том, как работает gevent на начальной странице.

122
ответ дан Ryan Artecona 23 August 2018 в 21:49
поделиться

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

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

. Другой вариант в соответствии с тем, что мы можем видеть в документах werkzeug , следует использовать параметр procesess, который получает число> 1, указывающее максимальное количество одновременных обрабатываемых процессов:

  • threaded - если процесс обрабатывает каждый запрос в отдельном потоке
  • процессов - если больше 1, то обрабатывать каждый запрос в новом процессе до этого максимального количества одновременных процессов.

Что-то вроде:

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

Подробнее о run() методе здесь и блоге в блоге , который заставил меня найти решение и api ссылки.

2
ответ дан DarkCygnus 23 August 2018 в 21:49
поделиться

Колба будет обрабатывать один запрос на поток одновременно. Если у вас есть 2 процесса с 4 потоками каждый, это 8 одновременных запросов.

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

21
ответ дан jd. 23 August 2018 в 21:49
поделиться

Нет. Вы можете определенно справиться с этим.

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

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

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

Эти «вещи» могут быть процессами, которые являются единицами кода, которые получают запускать одновременно в том смысле, что каждый процесс думает, что он работает в своем собственном мире со своей собственной, не разделяемой памятью.

Другим примером являются потоки, которые являются единицами кода внутри процессов, которые также допускают параллелизм.

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

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

Удачи!

* инструкции являются очень простые команды, которые может выполнять процессор. примеры - добавить два числа, перейти от одной инструкции к другой

6
ответ дан user1094786 23 August 2018 в 21:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: