Я пытаюсь написать простой сервер с Thrift. Сначала это выглядело многообещающим, но я столкнулся с проблемой одновременного подключения нескольких клиентов. Я использую TThreadPoolServer, который позволяет 4 клиенту подключаться, а затем блокирует других клиентов, пока я не убью его от подключенного. Что я могу сделать, чтобы одновременно подключать более (возможно, несколько сотен) клиентов, не увеличивая число потоков. Я предположил, что рабочие потоки позволяют выполнять один клиентский запрос за раз, но похоже, что один поток обрабатывает одно соединение до его закрытия. Я бы хотел избежать ситуации, когда мои клиенты должны снова открыть сокет для выполнения действия.Большое количество одновременных подключений в бережливости
5
A
ответ
3
Принимая другой подход, если вы используете C++ для создания своего сервера, вы можете использовать TNonblockingServer вместо TThreadPoolServer, что позволит вам принимать сразу несколько подключений, независимо от того, сколько потоков активно и т. Д.
Это, как говорится, не обязательно сможет работать быстрее (обработчики все еще выполняются в пуле потоков), но больше клиентов смогут сразу подключиться к вам.
Вот что код выглядит для сервера 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
Ваше ограничение четырех потоков в пуле встроен в конструктор по умолчанию в SimpleThreadManager:
class SimpleThreadManager : public ThreadManager::Impl {
public:
SimpleThreadManager(size_t workerCount=4, size_t pendingTaskCountMax=0) :
workerCount_(workerCount),
pendingTaskCountMax_(pendingTaskCountMax),
firstTime_(true) {
}
...
};
Этот объект ThreadManager передается ThreadPoolServer coonstructor, поэтому пройти большее число конструктору этого объекта для увеличения размера пула потоков.
Но он не хочет, чтобы увеличить количество потоков. –
Упс, я полностью пропустил это :( – JackOfAllTrades
Что вы увеличиваете в ожидании TaskCountMax, разве это не то, что вы хотите? – rmn