2012-06-13 7 views
7

Nie mam dużego doświadczenia w boost::asio. Mam kilka dość podstawowych pytań.Czy potrzebujemy wielu io_service na wątek dla boostu gwintowanego :: serwer asio z pojedynczym akceptorem

Czy muszę mieć inną io_service i inny socket pod inną thread ale jeden acceptor, aby przetwarzać klienta w gwintowaną serwerze?

Uważam, że muszę mieć inne gniazdo dla nowego klienta. Ale czy wszystkie wątki używają tego samego io_service czy byłby równoległy?

Przechodziłem przez http://en.highscore.de/cpp/boost/index.html w sekcji ASIO , która mówi, że muszę mieć różne io_services w różnych wątkach, aby osiągnąć równoległość.

I jeśli mam zamiar zrobić klasę serwera, który tworzy new TCPsession każdym razem, gdy nowy klient pojawia się w acceptor.async_accept
i TCPSession konstruktor tworzy io_service i thread i biegnie że io_service.run() we własnym wątku, że będzie to dobry projekt ?

Jednak w tym projekcie, gdzie chciałbym dołączyć wszystkie te wątki? potrzebuję kolejnego io_service dla main, aby nie kończyło się jeszcze przed uzyskaniem nowego klienta?

Odpowiedz

8

Pojedynczy io_service działający w jednym wątku może obsługiwać wszystkie obiekty asio w projekcie. W takim projekcie i/o nadal byłoby "równoległe" w tym sensie, że jest nie-blokujące, asynchroniczne; ale ponieważ io_service::run() jest uruchamiany w jednym wątku, wszystkie procedury obsługi zakończenia będą wywoływane kolejno, jeden po drugim.

Aby skalować moduł sieciowy na wiele procesorów, można użyć jednego z dwóch podejść: wątek na rdzeń, io_service na rdzeń - patrz HTTPServer2 and HTTPServer3 examples.

W każdym razie, tworząc wątek lub io_service za TCPSession wydaje mi się niepotrzebne napowietrznych - myślę o przypadku, gdy masz dostał tysiące TCPSession s ...

+0

Więc co będzie za wątków sesji zrobić? na przykład nie powinienem mieć jednej sesji w jednym wątku? aby każda sesja była równoległa? Jednak mam mieć jednocześnie <5 równoległych Sesji. Chociaż chciałbym poznać rozwiązanie ogólnego przeznaczenia –

+0

Nie, nie potrzebujesz tego. Przeczytaj: http://www.boost.org/doc/libs/1_47_0/doc/html/boost_asio/overview/core/async.html. Jedynym przypadkiem, w którym możesz potrzebować dodatkowych wątków, jest to, że moduły obsługi zakończeń TCPSession są zbyt ciężkie (np. Wykonują czasochłonne operacje bazy danych). Ale wtedy twoja aplikacja i tak nie byłaby skalowalna, więc musiałbyś zmienić projekt, aby podzielić lub przenieść trochę pracy z programów obsługi zakończenia. –

+0

Więc jeśli mam tylko inne gniazdo na sesję To będzie w porządku? i czy mogę najpierw rozwinąć całość w pojedynczym wątku? a następnie przejść do wielu wątków? –

Powiązane problemy