我用 Python/Twisted 编写了一个音频广播服务器。它工作正常,但内存的使用增长太快了!我认为这是因为某些用户的网络可能不够好,无法及时下载音频。
我的音频服务器向不同听众的客户端广播音频数据,如果其中一些不能及时下载音频,这意味着我的服务器会保留音频数据直到听众收到。更重要的是,我的音频服务器是一个广播服务器,它接收音频数据,并将它们发送到不同的客户端,我虽然 Twisted 将这些数据复制到不同的缓冲区中,即使它们是相同的音频片段。
我想减少内存占用,所以我需要知道客户端什么时候收到音频,这样我才能决定什么时候丢弃一些慢客户端。但我不知道如何用 Twisted 实现它。有人知道吗?
我还能做些什么来减少内存使用量?
谢谢。 维克多·林。
请您参考如下方法:
你没有说,但我假设你使用的是 TCP。由于客户端无法像您尝试发送数据那样快地接收数据,因此很难编写一个内存不断增加的基于 UDP 的系统。
TCP 具有内置的流量控制功能。如果接收方读取数据的速度无法达到您希望的发送速度,则您可以使用此信息,您可以放慢发送速度。这与 BSD 套接字 API 一起工作的方式是 send(2) 调用将阻塞或将返回 0 以指示它不能向发送缓冲区添加任何字节。它在 Twisted 中的工作方式是通过一个称为“生产者和消费者”的系统。该系统的要点是您向消费者注册生产者。生产者反复调用对消费者的写入。当消费者跟不上时,它会调用生产者的 pauseProducing。当消费者再次准备好接收更多数据时,它会调用生产者的 resumeProducing。
您可以在 producer/consumer howto 中阅读有关此系统的更多详细信息。 ,Twisted 文档的一部分。
