1

考虑以下场景:服务器上的一个进程用于处理来自网络连接的数据。Twisted 使这非常容易,spawnProcess您可以轻松地ProcessTransport在网络端使用您的协议连接。

但是,我无法确定 Twisted 如何处理来自网络的数据的可用速度快于进程对其标准输入执行读取的情况。据我所知,Twisted 代码主要使用内部缓冲区(self._buffer或类似的)来存储未使用的数据。这是否意味着来自快速连接(例如,通过本地千兆 LAN)的并发请求可能会填满主内存并导致大量交换,从而使情况变得更糟?如何防止这种情况?

理想情况下,内部缓冲区将具有上限。据我了解,如果操作系统的缓冲区已满,操作系统的网络代码会自动停止连接/开始丢弃数据包,这会降低客户端的速度。(是的,我知道,网络级别的 DoS 仍然是可能的,但这是一个不同的问题)。如果我自己实现它,这也是我将采取的方法:如果内部缓冲区已满,则不要从套接字读取。

在我的情况下,限制最大请求大小也不是一个选项,因为该服务应该能够处理任意大小的文件。

4

1 回答 1

5

解决方案有两个部分。

一部分称为生产者。生产者是产生数据的对象。TCP 传输是一个生产者。生产者有几个有用的方法:pauseProducingresumeProducing. pauseProducing导致传输停止从网络读取数据。 resumeProducing导致它再次开始阅读。这为您提供了一种避免在内存中建立尚未处理的无限数据量的方法。当您开始落后时,只需暂停运输即可。当你赶上时,继续它。

另一部分称为消费者。消费者是数据进入的对象。TCP 传输也是消费者。但是,对于您的情况,更重要的是,子进程传输也是消费者。消费者有几个方法,其中一种对你特别有用:registerProducer。这告诉消费者哪个生产者数据来自它。消费者可以调用它们pauseProducingresumeProducing根据其处理数据的能力。当传输(TCP 或进程)无法像生产者要求它发送数据那样快地发送数据时,它将暂停生产者。当它赶上时,它会再次恢复它。

您可以在 Twisted 文档中阅读更多关于生产者和消费者的信息

于 2012-04-24T17:24:22.340 回答