Twisted Server通过POST接收数据流,逐字节读取request.content.read(),延迟了一个多小时

问题描述 投票:0回答:1

我打算通过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
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()

如果我无法通过POST执行此操作,则切换到WebSocket不会有问题,但是我首先想尝试通过POST完成此操作。发布的数据运行时间长(每小时有一个新的POST请求,它处于活动状态并接收一个小时的数据),带宽相对较高的传感器数据约为1kbps。

我知道有更好的数据传输方法(WebSocket,MQTT,AMQP),但是通过NGINX SSL端点接收数据时,POST和WebSocket给我带来的麻烦最少。当前未使用NGINX(以丢弃可能引起的任何缓冲)。

python post streaming twisted deferred
1个回答
1
投票

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

请参见https://twistedmatrix.com/trac/ticket/288

© www.soinside.com 2019 - 2024. All rights reserved.