2009-06-05 18 views
5

Próbuję napisać prosty serwer z Thrift. Na początku wyglądało to obiecująco, ale natknąłem się na problem z wieloma klientami połączonymi w tym samym czasie. Używam TThreadPoolServer, który pozwala 4 klientowi łączyć się, a następnie blokować innych klientów, dopóki nie zabiję jednego z podłączonych. Co mogę zrobić, aby umożliwić jednoczesne połączenie większej liczby klientów (prawdopodobnie kilkuset) bez zwiększania liczby wątków. Zakładam, że wątki robocze pozwalają na wykonanie jednego żądania klienta naraz, ale wygląda na to, że jeden wątek obsługuje jedno połączenie, dopóki nie zostanie zamknięte. Chciałbym uniknąć sytuacji, w której moi klienci muszą ponownie otworzyć gniazdo, aby wykonać działanie.Duża liczba jednoczesnych połączeń w oszczędzaniu

Odpowiedz

3

Biorąc innego podejścia, jeśli używasz C++, aby zbudować swój serwer, można użyć TNonblockingServer zamiast TThreadPoolServer, który pozwoli Ci akceptować wiele połączeń na raz, niezależnie od tego, jak wiele wątków są aktywne, etc ...

W związku z tym niekoniecznie będziesz w stanie pracować szybciej (procedury obsługi nadal działają w puli wątków), ale więcej klientów będzie mogło połączyć się z tobą jednocześnie.

Oto co kod wygląda na serwerze NB:

shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory()); 
shared_ptr<MyHandler> handler(new MyHandler()); 
shared_ptr<TProcessor> processor(new MyProcessor(handler)); 
TNonblockingServer server(processor, protocolFactory, port); 
2

Twój ograniczenie czterech wątków w puli jest wbudowana domyślnego konstruktora SimpleThreadManager:

class SimpleThreadManager : public ThreadManager::Impl { 

public: 
    SimpleThreadManager(size_t workerCount=4, size_t pendingTaskCountMax=0) : 
    workerCount_(workerCount), 
    pendingTaskCountMax_(pendingTaskCountMax), 
    firstTime_(true) { 
    } 
... 
}; 

Ten obiekt ThreadManager jest przekazywany do coonstructor ThreadPoolServer, więc przekazać większą liczbę do konstruktora tego obiektu aby zwiększyć rozmiar puli wątków.

+0

Ale on nie chce zwiększyć liczbę wątków. –

+0

Ups, całkowicie mi to umknęło :( – JackOfAllTrades

+1

czym jest zwiększenie oczekującegoTaskCountMax, czy to nie jest to, czego chcesz? – rmn

Powiązane problemy