Как «один» IOLoop может обрабатывать 10 тыс. соединений?

извините за этот глупый вопрос, но я действительно запутался; и я надеюсь, что вы поправите меня, где я не прав.

на поточных серверах (таких как Apache), я понимаю, что для каждого клиента будет создан новый "рабочий" для удовлетворения всех его потребностей.

в управляемых событиями (таких как Nginx и Tornado) это приводит меня в замешательство, особенно там, где есть Not Thread Safe, такие как GIL Python; насколько я понимаю, есть ОДИН ЦИКЛ, который будет обрабатывать ВСЕ клиентские запросы, поэтому, насколько я понимаю, если есть 10 000 одновременных подключений, я не вижу, как обслуживать ВСЕ эти 10 тысяч запросов!


person Abdelouahab Pp    schedule 02.12.2012    source источник


Ответы (1)


На серверах, управляемых событиями, вы просто обрабатываете соединения (на самом деле read() и write() из определенных соединений) одно за другим, используя неблокирующие вызовы. Обычно вы используете некоторый вызов для мультиплексирования между соединениями (select(), poll(),...), который сообщает вам, какие соединения необходимо обслуживать, и вы обслуживаете их по очереди.

person ninjalj    schedule 02.12.2012
comment
так почему мы не можем комбинировать серверы, управляемые событиями, и серверы, основанные на потоках? - person Abdelouahab Pp; 02.12.2012
comment
Ты сможешь. например: у вас может быть поток для каждого ядра ЦП, где каждый поток управляется событиями. У вас также могут быть рабочие потоки для работы с динамической генерацией страниц (PHP, JSP,...) и обслуживания статического содержимого (изображения,...) через обычные потоки, управляемые событиями. - person ninjalj; 02.12.2012
comment
проблема в том, что Python (CPytohn) имеет GIL, и, как сказано, Tornado обрабатывает соединение 10k, поэтому я был «шокирован», что может случиться! если происходит одновременное подключение 10k, то, если операция занимает 1 секунду, il будет разделен на 1/10k? - person Abdelouahab Pp; 02.12.2012
comment
По-разному. Tornado, вероятно, может обрабатывать типичные соединения 10k/s, но физические ограничения все еще существуют: если у вас нет полосы пропускания, вы не сможете обрабатывать соединения 10k/s, запрашивая загрузку большого файла. В этом случае при обслуживании каждого соединения , идеальным было бы, если бы ваш сервер отправлял только (осторожно: формула составляется на месте) (полоса пропускания*желаемая максимальная задержка/активные соединения) на каждой итерации. - person ninjalj; 02.12.2012
comment
извините, но что вы подразумеваете под пропускной способностью, если я использую ADSL 2 Мбит (Алжир - лучшее, что я могу сделать), это значение? - person Abdelouahab Pp; 02.12.2012
comment
В этом случае это будет ваша исходящая пропускная способность, которая, вероятно, намного ниже. Занятые серверы должны иметь гораздо большую пропускную способность. - person ninjalj; 02.12.2012
comment
так что в моем случае я должен думать о проблеме 1k вместо 10k :p - person Abdelouahab Pp; 02.12.2012
comment
по последнему вопросу: если событие, управляемое только чтением и записью определенного соединения, то на основе какого потока? - person Abdelouahab Pp; 02.12.2012