Цикл обработки событий
Цикл обработки событий и взаимодействие с потоковым пулом
У сервиса CppCMS простая конструкция одного цикла обработки событий и потокового пула, обрабатывающего фактические отклики приложения пользователя
Каждый новый входящий запрос FastCGI, SCGI или HTTP принимается сервисом CppCMS и обрабатываются быстрым и эффективным циклом обработки событий CppCMS , базирующимся на системных вызовах epoll
, kqueue
, /dev/poll
или select
.
При входящем запросе, создается специальный HTTP-контекст. Он подготавливает входящий запрос, считывает все POST-данные и парсит его, при необходимости, в центральном цикле обработки событий.
Как только запрос будет готов, он проверяется пулом приложений CppCMS, чтобы определить, какие объекты приложения будут его обрабатывать.
Если приложение обработки синхронное - его выполнение передается в потоковый пул. Пользовательское приложение подготавливает ответ, посылает его синхронно клиенту и контекст уничтожается, завершая цикл "request/response".
Если приложение асинхронное - HTTP-контекст остается внутри потока цикла обработки событий и обрабатывается асинхронным приложением. Это приложение может решить немедленно завершить ответ или отложить его выполнение, например, в случае long polling.
Интеграция с циклом обработки событий CppCMS
Есть несколько способов взаимодействия с циклом обработки событий, кроме очевидного - реализации собственного асинхронного приложения:
Использовать функцию
cppcms::service::get_io_service()
, для прямого доступа к циклу обработки событий.Здесь можно использовать любые классы
booster::aio
и обрабатывать различные асинхронные события.Можно "постить" различные операции для выполнения в цикле обработки событий используя
cppcms::service::post()
из других потоков.Это особенно важно, когда хотите сделать интеграцию между синхронными и асинхронными приложениями.
Вы должны помнить, что большинство объектов CppCMS, включая
http::context
- не являются потокобезопасными для доступа из нескольких потоков, поэтому если какая-то операция должна быть выполнена над объектами, работающими в цикле обработки событий, это должно быть сделано "постингом" обработчиков для выполнения в цикле обработки событий.
Важно помнить, что каждая операция выполняющаяся в цикле обработки событий должна быть очень быстрой и никогда не блокирующей.