C++ で記述されたノンブロッキング マルチスレッドのリサイクル サーバーと、python で記述されたリサイクル クライアントがあります。以下のコード スニペットは、thrift プロトコルとバインディング構成が C++ サーバーと Python クライアントの両方でどのように行われるかを簡単に示しています。
私の問題は、Python クライアントが thrift を介して C++ サーバーを呼び出すと、C++ サーバー出力 (つまり、端末) に「 thrift non-blocking server overload condition 」というエラーが表示されることです。これは、3 番目と 4 番目に示されています。以下のスニペット。参考までに、GDB backtrace コマンドで取得したスタックも同封します。ここで何が欠けているのか誰か教えてもらえますか? このエラーの考えられる原因は何だと思いますか。Python側またはC++側のthrift構成に問題はありますか? 以下のスニペットを参照してください。私はたくさんのグーグルを作りましたが、これまで手がかりを見つけることができませんでした. ありがとう。
1) Python クライアント - Thrift 構成
try:
self.transport = TSocket.TSocket( host , port)
<----- NONBLOCKING --------->
self.transport = TTransport.TFramedTransport(self.transport)
<----- NONBLOCKING --------->
protocol = TBinaryProtocol.TBinaryProtocol(self.transport)
# Instantiate the thrift client
self.client = MyService.Client(protocol)
# Connect to the thrift server
self.transport.open()
print 'Connection established via thrift...\n'
2) C++ サーバー - Thrift 構成
using boost::shared_ptr;
printf(" *** Starting non-block THRIFT! ***\n");
shared_ptr<MyServiceHandler> handler(new MyServiceHandler(this));
shared_ptr<TProcessor> processor(new MyServiceProcessor(handler));
shared_ptr<TProtocolFactory> protocolFactory(new TBinaryProtocolFactory());
shared_ptr<ThreadManager> threadManager=ThreadManager::newSimpleThreadManager(15);
shared_ptr<PosixThreadFactory> threadFactory =
shared_ptr<PosixThreadFactory>(new PosixThreadFactory());
threadManager->threadFactory(threadFactory);
threadManager->start();
ats::TNonblockingServer server(processor,protocolFactory, port, threadManager);
server.serve();
3) C++ サーバーでのエラー出力
!!!! ERROR BEGIN !!!!
Thrift: Tue Nov 15 17:59:49 2011 **thrift non-blocking server overload condition**
!!!! ERROR IS END !!!!
4) GDB バックトレーススタック
thrift non-blocking server overload condition
Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0xb7ad7b70 (LWP 17961)]
0x080bb3a8 in vtable for __cxxabiv1::__si_class_type_info ()
(gdb) bt
#0 0x080bb3a8 in vtable for __cxxabiv1::__si_class_type_info ()
#1 0xb7ec8195 in apache::thrift::server::TConnection::workSocket (this=0x80be4f0)
at src/server/TNonblockingServer.cpp:168
#2 0xb7ecc88d in apache::thrift::server::TConnection::eventHandler (fd=13, v=0x80be4f0)
at src/server/TNonblockingServer.h:915
#3 0xb7ea8e90 in event_base_loop () from /usr/lib/libevent-1.4.so.2
#4 0xb7ec782f in apache::thrift::server::TNonblockingServer::serve (this=0xb7ad7194)
at src/server/TNonblockingServer.cpp:923
#5 0x0807bef5 in MyConfiguration::runNonBlockingServer (this=0xbffff2ec, port=9090)
at /home/configuration/my_configuration.cpp:485
#6 0x0807de19 in MyConfiguration::run (this=0xbffff2ec)
at /home/configuration/my_configuration.cpp:54
#7 0x08078a2a in redirectPthreadRun (m=0xbffff2ec)
at /home/src/common/p_thread_run.cpp:107
#8 0xb7fa0725 in start_thread () from /lib/libpthread.so.0
#9 0xb7ceb1ce in clone () from /lib/libc.so.6