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

Twisted Server receive data stream via POST, read request.content.read() byte by byte in a deferred for over an hour

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

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

这是服务器处理程序的样子:

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),但是 POST 和 WebSocket 在通过 NGINX SSL 端点接收数据时给我带来的麻烦最少。当前未使用 NGINX(丢弃它可能导致的任何缓冲)。

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

https://twistedmatrix.com/trac/ticket/288