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
抽象中不支持流式上传。
我打算通过 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
抽象中不支持流式上传。