Я реализую небольшой веб-сервер, используя epoll
с неблокирующим вводом / выводом (для сокета установлен неблокирующий) и пул потоков. Я бы хотел, чтобы он имел ту же структуру, что и Nginx. Таким образом, базовое c событие l oop будет выглядеть так:
while (1) {
...
int n = epoll_wait();
for (i = 0; i < n; ++i) {
events = events[i].events;
req = events[i].data.ptr;
...
rev = req->read;
if (events & EPOLLIN) {
rev->handler();
}
wev = req->write;
if (events & EPOLLOUT) {
wev->handler();
}
}
}
Функция-обработчик событий чтения и записи в основном включает в себя read
от клиента, анализирует входящий запрос и sendfile
et c.
Что касается введения пула потоков, я прочитал этот пост из Nginx и там сказано, что они переносят задачи, такие как read
и sendfile
, в потоки, чтобы справиться с ними, но я понятия не имею, как этого добиться. Откуда мне передавать задачу потокам?
Может кто-нибудь показать мне пример или даже лучше всего проект (не слишком большой) , если вы уже делали то же самое раньше? Пожалуйста, помогите мне!