Python 对于简单的操作来说,Thrift服务器非常慢

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

我正在运行一个简单的Thrift服务器()作为Python(服务器)和Haskell(客户端)之间的跨语言平台。唯一需要发送的数据结构是一个三元组的double,因此服务器/客户机实现也非常简单——只需遵循教程即可

然而,它真的,真的很慢!每次服务器响应的响应时间约为0.5s,而我需要的响应时间约为0.1s或更低

有人对如何加快这一进程有什么想法吗?您可以在下面看到我的简单服务器实现:

  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