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