Действительно крутая часть цепочки фильтров заключается в том, что каждый фильтр не ждет завершения предыдущего фильтра;он может обрабатывать вывод предыдущего фильтра по мере его создания, что-то вроде конвейера Unix.(из здесь )
Я предполагаю, что выше говорится о таком коде в конце каждого фильтра:
if (!chain_contains_last_buffer)
return ngx_http_next_body_filter(r, in);
То есть nginx последовательно устанавливает фильтры.Но так как в конце каждого фильтра, он должен ждать, пока текущий фильтр не будет выполнен.Я не понимаю, как nginx удается сделать each filter doesn't wait for the previous filter to finish
.
Итак, вышеизложенное касается параллелизма фильтра nginx, далее речь идет о параллелизме обработки запросов nginx:
Как мы знаемnginx использует epoll
для обработки запросов:
events = epoll_wait(ep, event_list, (int) nevents, timer);
for (i = 0; i < events; i++) {
...
rev->handler(rev);
}
С кодом, подобным приведенному выше, я не думаю, что nginx может обрабатывать два запроса одновременно, он может делать это только один за другим (каждый handler
завершаетсяего работа достаточно быстрая, поэтому следующий запрос будет обработан довольно скоро), верно?
Или есть какая-то ошибка, по которой я скучаю?