## Event Loop and Thread Pool interaction
|
|
The CppCMS service has a simple design of a single event
|
loop, and a thread pool that handles actual user
|
application responses.
|
|
Every new incoming FastCGI, SCGI or HTTP request
|
is accepted by the CppCMS service and handled
|
by the fast and efficient CppCMS event loop that is
|
based on `epoll`, `kqueue`, `/dev/poll` or `select`
|
system calls.
|
|
On an incoming request, a special HTTP Context is created.
|
It prepares the incoming request, reads all POST data and
|
if required parses it within the central event loop.
|
|
Once the request is ready, it is checked against the
|
CppCMS applications pool to detect which
|
application object handles it.
|
|
If the application that handles it is a synchronous
|
application, its execution is passed to the
|
_thread pool_. The user application prepares the response
|
and sends it synchronously to the client and the context
|
is destroyed, completing the "request/response" cycle.
|
|
If the application is asynchronous, the HTTP Context
|
remains inside the event loop's thread and it is handled by
|
the asynchronous application. This application
|
may decide to complete the response immediately
|
or postpone it by implementing, for example, long polling.
|
|
|
## Integration with CppCMS Event Loop
|
|
There are several ways to interact with the event loop,
|
besides the obvious - implementing your own asynchronous
|
application:
|
|
1. Use the `cppcms::service::get_io_service()` function
|
to access the event loop directly.
|
|
You can use any of the [`booster::aio`](/cppcms_ref_v0_99/namespacebooster_1_1aio.html) classes there
|
and handle various asynchronous events.
|
|
2. You can post various operations for execution
|
in the event loop using `cppcms::service::post()`
|
from other threads.
|
|
This is especially important when you want to
|
do integration between synchronous and asynchronous
|
applications.
|
|
You should remember that most of the CppCMS objects
|
including `http::context` are not thread safe
|
for access from multiple threads, so
|
if some operation should be executed on
|
objects running in the event loop, it must
|
be done by posting handlers for execution
|
in the event loop.
|
|
It is important to remember that
|
every operation executed in the event
|
loop should be _very fast_ and _never block_.
|
|
|
|
---
|
|
← [CppCMS 1.x.x Configuration][prev]
|
| [Top](#maincontent)
|
| [Understanding Application Lifetime][next] →
|
|
[prev]: /wikipp/en/page/cppcms_1x_config
|
[next]: /wikipp/en/page/cppcms_1x_application_lifetime |