您能检测出客户端跟上网络套接字消息流的状况吗?

时间:2019-04-16 06:22:38

标签: python websocket tornado

我正在编写视频流服务,并且正在考虑通过网络套接字流视频。

我预见到的一个问题是客户端没有足够的带宽来接收流,因此我希望能够检测到我是否离客户端太远了,并将消息降低到较低的帧频或质量。

您能检测出龙卷风何时发送过多的信息以使客户端无法接收?

1 个答案:

答案 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操作很快,在下一条语句中,循环也会休眠直到截止日期为止,从而允许服务器为其他客户端提供服务。