men*_*nsi 1 python memory-management twisted
请考虑以下情形:服务器上的进程用于处理来自网络连接的数据.Twisted使这非常简单,spawnProcess您可以轻松地ProcessTransport在网络端连接您的协议.
但是,我无法确定Twisted如何处理来自网络的数据可用的速度比进程对其标准输入执行读取的速度更快的情况.据我所知,Twisted代码主要使用内部缓冲区(self._buffer或类似的)来存储未使用的数据.这是否意味着来自快速连接(例如,通过本地千兆局域网)的并发请求可能会填满主内存并导致大量交换,使情况更糟?如何防止这种情况?
理想情况下,内部缓冲区将具有上限.据我了解,如果操作系统的缓冲区已满,操作系统的网络代码将自动停止连接/开始丢弃数据包,这会降低客户端的速度.(是的,我知道,网络级别的DoS仍然可以,但这是一个不同的问题).这也是我自己实现的方法:如果内部缓冲区已满,就不要从套接字读取.
在我的情况下,限制最大请求大小也不是一个选项,因为服务应该能够处理任意大小的文件.
解决方案有两个部分.
一部分被称为生产者.生产者是数据来自的对象.TCP传输是生产者.制作人有几个有用的方法:pauseProducing和resumeProducing. pauseProducing导致传输停止从网络读取数据. resumeProducing导致它再次开始阅读.这为您提供了一种避免在尚未处理的内存中构建无限量数据的方法.当你开始落后时,只需暂停运输.当你赶上来,恢复它.
另一部分称为消费者.消费者是数据进入的对象.TCP传输也是消费者.但更重要的是,对于您的情况,儿童过程运输也是一种消费者.消费者有一些方法,特别是对你有用的方法:registerProducer.这告诉消费者哪个生产者数据来自它.消费者可以叫他们pauseProducing,并resumeProducing根据其处理数据的能力.当传输(TCP或进程)无法像生产者要求它发送数据那样快地发送数据时,它将暂停生产者.当它赶上时,它将再次恢复.
您可以在Twisted文档中阅读有关生产者和消费者的更多信息.