节俭中的大量同时连接

时间:2009-06-05 09:06:57

标签: c++ thrift

我正在尝试使用Thrift编写一个简单的服务器。一开始它看起来很有希望,但我偶然发现了许多客户连接的问题。我正在使用TThreadPoolServer,它允许4个客户端连接,然后阻止其他客户端,直到我从连接中杀死一个。我可以做些什么来允许更多(可能几百个)客户端同时连接,而不增加线程数。我假设工作线程允许一次执行一个客户端请求,但看起来一个线程处理一个连接,直到它关闭。当我的客户必须重新打开套接字来执行操作时,我想避免这种情况。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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,因此将更大的数字传递给此对象的构造函数以增加线程池的大小。