我正在尝试用 Thrift 编写一个简单的服务器。一开始它看起来很有希望,但我偶然发现了同时连接多个客户端的问题。我正在使用 TThreadPoolServer,它允许 4 个客户端连接,然后阻止其他客户端,直到我从连接中杀死一个。在不增加线程数量的情况下,我能做些什么来允许同时连接更多(可能数百个)客户端。我假设工作线程允许一次执行一个客户端请求,但看起来一个线程处理一个连接直到它被关闭。我想避免我的客户必须重新打开套接字才能执行操作的情况。
问问题
6534 次
2 回答
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);
于 2010-06-18T07:51:17.830 回答
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 的构造函数,所以传递一个更大的数字给这个对象的构造函数来增加你的线程池的大小。
于 2009-06-24T21:58:10.963 回答