Python 对于简单的操作来说,Thrift服务器非常慢
我正在运行一个简单的Thrift服务器()作为Python(服务器)和Haskell(客户端)之间的跨语言平台。唯一需要发送的数据结构是一个三元组的double,因此服务器/客户机实现也非常简单——只需遵循教程即可 然而,它真的,真的很慢!每次服务器响应的响应时间约为0.5s,而我需要的响应时间约为0.1s或更低 有人对如何加快这一进程有什么想法吗?您可以在下面看到我的简单服务器实现:Python 对于简单的操作来说,Thrift服务器非常慢,python,haskell,thrift,thrift-protocol,Python,Haskell,Thrift,Thrift Protocol,我正在运行一个简单的Thrift服务器()作为Python(服务器)和Haskell(客户端)之间的跨语言平台。唯一需要发送的数据结构是一个三元组的double,因此服务器/客户机实现也非常简单——只需遵循教程即可 然而,它真的,真的很慢!每次服务器响应的响应时间约为0.5s,而我需要的响应时间约为0.1s或更低 有人对如何加快这一进程有什么想法吗?您可以在下面看到我的简单服务器实现: 1 import sys 2 3 from vision import Vision 4 f
1 import sys
2
3 from vision import Vision
4 from vision.ttypes import *
5
6 from thrift.transport import TSocket
7 from thrift.transport import TTransport
8 from thrift.protocol import TBinaryProtocol
9 from thrift.protocol.TBinaryProtocol import TBinaryProtocolAccelerated
10 from thrift.server import TServer
11
12 class VisionHandler:
13 def observe(self):
14 ret = Position()
15 ret.x,ret.y,ret.z = (1,2,3)
16 return ret
17
18 ret = Position()
20 handler = VisionHandler()
21 processor = Vision.Processor(handler)
22 transport = TSocket.TServerSocket(port=9090)
23 tfactory = TTransport.TBufferedTransportFactory()
24 pfactory = TBinaryProtocol.TBinaryProtocolFactory()
25
26 server = TServer.TSimpleServer(processor, transport, tfactory, pfactory)
27
28 print 'Starting the vision server...'
29 server.serve()
30 print 'done.'
客户端只需通过运行
36 client = do
37 handle <- hOpen ("localhost", PortNumber 9090)
38 let binProto = BinaryProtocol handle
39 return (binProto, binProto)
36客户端=do
37手柄最有可能是因为插座选项。我不记得Thrift是否允许设置套接字选项,但是设置TCP\u NODELAY
关闭拥塞控制有可能解决问题
如果代码与您使用的代码相同,则可以轻松访问套接字。尝试子类化TSocket
应该为服务器端(从accept()返回的套接字)和客户端(客户端创建的套接字)上的套接字发送/接收数据设置该选项。节俭并不慢,所以问题不应该出在序列化上,除非你正在序列化一些非常可怕的东西。这意味着问题在于所有“连接、发送数据、获得答案”的东西。几乎可以肯定的是,这是因为Nagle算法被TCP\u NODELAY
关闭了。除了Ellioh回答中关于套接字选项的建议之外,问题之一是,您的操作似乎有点小,可以通过套接字处理,并且大部分时间都花在网络和类似的延迟上。通常,人们会尝试将您的通话分组,以便在每次通话中传输更多数据和做更多工作。粒度在网络分布式应用程序中非常重要,您需要找到一个衡量良好性能的好方法。Hmmm。。。我想知道如何启用此功能。不幸的是,Thrift文档似乎有些不足。请尝试查找套接字对象。类似于setsockopt()的内容应该可以完成这项工作。首先看一下TSocket,在这方面我是个新手——我复制了TServerSocket的实现。我尝试将self.handle.setsockopt(socket.IPPROTO_TCP,socket.TCP_NODELAY,1)添加到句柄定义中,但速度仍然很慢…尝试同时在服务器和客户端中添加。双方都不应该延迟。我已经将双方的TCP_节点延迟设置为1。这在haskell上相当简单,但python代码对我来说不太明显-我尝试在代码中大量地使用self.handle.setsockopt(socket.IPPROTO_-TCP,socket.TCP_-NODELAY,1)和self.handle.setsockopt(socket.SOL_-TCP,socket.TCP_-NODELAY,1),但仍然没有成功。不幸的是,这最终成了问题。我最终选择了一个更简单的解决方案,使用了一个基于本地的HTTP服务器,它工作得很好。
res <- Client.observe =<< client