Я понимаю, что они работают каким-то образом, отличным от создания потока для каждого пользователя. Как именно это работает?
(Имеет ли к этому какое-то отношение «неблокировка»?)
Я понимаю, что они работают каким-то образом, отличным от создания потока для каждого пользователя. Как именно это работает?
(Имеет ли к этому какое-то отношение «неблокировка»?)
Из документации Twisted:
Реактор — это ядро цикла событий в Twisted — цикла, управляющего приложениями, использующими Twisted. Цикл событий — это программная конструкция, которая ожидает и отправляет события или сообщения в программе. Он работает, вызывая какого-либо внутреннего или внешнего «поставщика событий», который обычно блокируется до тех пор, пока не поступит событие, а затем вызывает соответствующий обработчик события («отправляет событие»). Реактор предоставляет базовые интерфейсы для ряда служб, включая сетевые коммуникации, многопоточность и диспетчеризацию событий.
См. также http://en.wikipedia.org/wiki/Event_loop.
Неблокирующий относится к тому, что если вы хотите обрабатывать события в более чем одном сокете (или, в более общем случае, из более чем двух источников любого типа) в одном потоке, вы не можете используйте операции блокировки для обработки этих событий. Если вы выполняете чтение с блокировкой в первом сокете, вы не сможете читать из второго сокета, пока некоторые байты не поступят в первый. Это не очень хорошо работает, так как вы не можете точно знать, какой сокет будет считывать байты первым. Вместо этого вы используете что-то вроде select
(более подробно описанное на странице Википедии, указанной выше), чтобы сообщить вам, в каком сокете есть байты, а затем прочитать их из этого сокета без блокировки.
Все это означает, что вы можете обслуживать события из любого количества источников событий одно за другим, создавая видимость обработки их всех одновременно.