我正在编写视频流服务,并且正在考虑通过网络套接字流视频。
我预见到的一个问题是客户端没有足够的带宽来接收流,因此我希望能够检测到我是否离客户端太远了,并将消息降低到较低的帧频或质量。
您能检测出龙卷风何时发送过多的信息以使客户端无法接收?
答案 0 :(得分:1)
您不必担心网络速度慢;但您确实需要担心快速建立网络。
您将无法向网络中写入比客户端能够接受的更多的数据。所以你不会前进。
假设您正在分块阅读和发送视频。这是您的代码可能如下所示:
while True:
self.write(chunk)
await self.flush() # write chunk to network
await self.flush()
语句将暂停循环,直到将块写入网络为止。因此,如果网络速度较慢,它将暂停更长的时间。如您所见,您不必担心遥遥领先于客户。
但是,如果您客户端的网络速度很快,那么flush
操作也会非常快,这可能会阻塞您的服务器,因为此循环将一直运行,直到发送完所有数据并且IOLoop不会有机会为其他客户提供服务。
对于这些情况,龙卷风的维护者Ben Darnell在google forums thread中提供了一个非常巧妙的解决方案,他称之为:
以“公平”的价格为每个客户端提供服务,而不是让单个客户端消耗尽可能多的带宽。
下面是代码(直接从Ben Darnell的帖子中获取):
while True:
# Start the clock to ensure a steady maximum rate
deadline = IOLoop.current().time() + 0.1
# Read a 1MB chunk
self.write(chunk)
await self.flush()
# This sleep will be instant if the deadline has already passed;
# otherwise we'll sleep long enough to keep the transfer
# rate around 10MB/sec (adjust the numbers above as needed
# for your desired transfer rate)
await gen.sleep(deadline)
现在,即使flush
操作很快,在下一条语句中,循环也会休眠直到截止日期为止,从而允许服务器为其他客户端提供服务。