Napisałem serwer wykorzystujący boost::asio::ssl, który zawierał pulę 10 wątków obsługujących żądania klientów.
Szybko jednak okazało się, że żądania od klientów zawsze są obsługiwane w jednym wątku roboczym:
jeśli wątek ten wykonywał długą operację, to request od innego klienta czekał aż operacja w pierwszym wątku zakończy się.
Dokładną przyczynę tego błędu opisałem na grupie boost-users w poście:
"[asio] SSL enabled http server3 example is blocking"
Rozwiązanie problemu jest dość proste:
nie wykonywać długich operacji bezpośrednio w handlerze wywoływanym przez async_read(), async_write(). Zamiast tego handler powinien wysłać tę operację do io_serwis, aby wykonała się asynchoriniczie.
Przykład handlera wywyoływanego po asynchronicznym odczycie danych (requestu od klienta):
void Request::readHeaderHandler( const boost::system::error_code
&error, std::size_t bytesTransferred )
{
m_ioService.post( boost::bind
( &Request::executeCommandHandler::executeCommandHandler,
shared_from_this() ) );
}
void Request::executeCommandHandler()
{
// long running operation
char c;
}
Subskrybuj:
Komentarze do posta (Atom)
Ten komentarz został usunięty przez administratora bloga.
OdpowiedzUsuń42 year old Executive Secretary Deeanne Laver, hailing from Quesnel enjoys watching movies like Mysterious Island and Mushroom hunting. Took a trip to Primeval Beech Forests of the Carpathians and drives a Neon. przejsc na strone
OdpowiedzUsuń