Python Twisted服务器通过POST、read request.content.read()逐字节接收数据流,延迟时间超过一小时

Python Twisted服务器通过POST、read request.content.read()逐字节接收数据流,延迟时间超过一小时,python,post,streaming,twisted,deferred,Python,Post,Streaming,Twisted,Deferred,我打算通过http POST调用接收二进制数据流 我相信客户端正在工作,也就是说,它将字节块写入服务器,我可以看到使用tcpdump发送的数据量,但是Twisted的request.content类文件对象仅在客户端断开连接后才开始生成输出 这就是服务器处理程序的外观: def render(self, request): if request.path == '/incoming-stream': d = deferLater(reactor, 0, lambda: request

我打算通过http POST调用接收二进制数据流

我相信客户端正在工作,也就是说,它将字节块写入服务器,我可以看到使用tcpdump发送的数据量,但是Twisted的request.content类文件对象仅在客户端断开连接后才开始生成输出

这就是服务器处理程序的外观:

def render(self, request):
  if request.path == '/incoming-stream':
    d = deferLater(reactor, 0, lambda: request)
    d.addCallback(self.async_read)
    return NOT_DONE_YET
如果我不能用POST来实现这一点,我可以切换到WebSocket,但我想首先尝试通过POST来实现这一点。发布的数据每小时长时间运行一个新的POST请求,它处于活动状态并接收一小时的数据,相对较高的带宽传感器数据约为1kbps


我知道有更好的方法传输数据WebSocket、MQTT、AMQP,但POST和WebSocket在通过NGINX SSL端点接收数据时给我带来的麻烦最少。目前,NGINX没有被用来丢弃它可能导致的任何缓冲。

Twisted Web在其IResource抽象中不支持流式上传

def async_read(self, request):
  sys.stdout.write('\nasync_read ' + str(request) + '\n')
  sys.stdout.flush()
  while True:
    byte = request.content.read(1) # <--- read one byte
    if len(byte) > 0:
      sys.stdout.write(repr(byte))
      sys.stdout.flush()
    else:
      break
  sys.stdout.write('\nfinished ' + str(request) + '\n')
  sys.stdout.flush()
  request.write(b"finished")
  request.finish()