## Цикл обработки событий и взаимодействие с потоковым пулом |
|
У сервиса CppCMS простая конструкция одного цикла обработки событий и потокового пула, обрабатывающего фактические отклики приложения пользователя |
|
Каждый новый входящий запрос FastCGI, SCGI или HTTP принимается сервисом CppCMS и обрабатываются быстрым и эффективным циклом обработки событий CppCMS , базирующимся на системных вызовах `epoll`, `kqueue`, `/dev/poll` или `select`. |
|
При входящем запросе, создается специальный HTTP-контекст. |
Он подготавливает входящий запрос, считывает все POST-данные и |
парсит его, при необходимости, в центральном цикле обработки событий. |
|
Как только запрос будет готов, он проверяется пулом приложений CppCMS, чтобы определить, какие объекты приложения будут его обрабатывать. |
|
Если приложение обработки синхронное - его выполнение передается в _потоковый пул_. Пользовательское приложение подготавливает ответ, посылает его синхронно клиенту и контекст уничтожается, завершая цикл "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` - не являются потокобезопасными |
для доступа из нескольких потоков, поэтому |
если какая-то операция должна быть выполнена над |
объектами, работающими в цикле обработки событий, это должно |
быть сделано "постингом" обработчиков для выполнения |
в цикле обработки событий. |
|
Важно помнить, что |
каждая операция выполняющаяся в цикле обработки событий |
## Цикл обработки событий и взаимодействие с потоковым пулом
|
|
У сервиса CppCMS простая конструкция одного цикла обработки событий и потокового пула, обрабатывающего фактические отклики приложения пользователя
|
|
Каждый новый входящий запрос FastCGI, SCGI или HTTP принимается сервисом CppCMS и обрабатываются быстрым и эффективным циклом обработки событий CppCMS , базирующимся на системных вызовах `epoll`, `kqueue`, `/dev/poll` или `select`.
|
|
При входящем запросе, создается специальный HTTP-контекст.
|
Он подготавливает входящий запрос, считывает все POST-данные и
|
парсит его, при необходимости, в центральном цикле обработки событий.
|
|
Как только запрос будет готов, он проверяется пулом приложений CppCMS, чтобы определить, какие объекты приложения будут его обрабатывать.
|
|
Если приложение обработки синхронное - его выполнение передается в _потоковый пул_. Пользовательское приложение подготавливает ответ, посылает его синхронно клиенту и контекст уничтожается, завершая цикл "request/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` - не являются потокобезопасными
|
для доступа из нескольких потоков, поэтому
|
если какая-то операция должна быть выполнена над
|
объектами, работающими в цикле обработки событий, это должно
|
быть сделано "постингом" обработчиков для выполнения
|
в цикле обработки событий.
|
|
Важно помнить, что
|
каждая операция выполняющаяся в цикле обработки событий
|
должна быть _очень быстрой_ и _никогда не блокирующей_. |