2009-06-05 10 views
5

Sto provando a scrivere un server semplice con parsimonia. All'inizio sembrava promettente, ma mi sono imbattuto in un problema con un numero di client connessi allo stesso tempo. Sto usando TThreadPoolServer, che consente a 4 client di connettersi e quindi blocca altri client finché non ne uccido uno dal connesso. Cosa posso fare per consentire a più client (possibilmente diverse centinaia) di connettersi contemporaneamente, senza aumentare il numero di thread. Supponevo che i thread worker permettessero di eseguire una richiesta client alla volta, ma sembra che un thread gestisca una connessione finché non viene chiusa. Vorrei evitare una situazione in cui i miei clienti devono riaprire un socket per eseguire un'azione.Gran numero di connessioni simultanee in parsimonia

risposta

3

Un altro approccio, se si utilizza C++ per creare il server, è possibile utilizzare TNonblockingServer anziché TThreadPoolServer, che consente di accettare molte connessioni contemporaneamente, indipendentemente dal numero di thread attivi, ecc ...

Detto questo, non sarà necessariamente possibile eseguire il lavoro più rapidamente (i gestori vengono ancora eseguiti in un pool di thread), ma più client potranno connettersi contemporaneamente.

Ecco ciò che il codice è simile per il server 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

tuo prescrizione di quattro thread nel pool è integrato nel costruttore di default del SimpleThreadManager:

class SimpleThreadManager : public ThreadManager::Impl { 

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

Tale scopo ThreadManager viene passato al coonstructor ThreadPoolServer, quindi passare un numero più grande per la costruzione di questo oggetto per aumentare la dimensione del pool di thread.

+0

Ma lui non vuole aumentare il numero di thread. –

+0

Whoops, ho assolutamente perso questo :( – JackOfAllTrades

+1

qual è il tuo aumento in sospesoTaskCountMax, non è quello che vuoi? – rmn