Цикл обработки событий
Цикл обработки событий и взаимодействие с потоковым пулом
У сервиса 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- не являются потокобезопасными для доступа из нескольких потоков, поэтому если какая-то операция должна быть выполнена над объектами, работающими в цикле обработки событий, это должно быть сделано "постингом" обработчиков для выполнения в цикле обработки событий.
Важно помнить, что каждая операция выполняющаяся в цикле обработки событий должна быть очень быстрой и никогда не блокирующей.
 
 