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