twisted应用中的内存边界

2024-04-16 17:46:34 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑以下场景:服务器上的进程用于处理来自网络连接的数据。Twisted使用spawnProcess可以很容易地将ProcessTransport与网络端的协议连接起来。在

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

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

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


Tags: 数据代码网络服务器协议标准进程场景
1条回答
网友
1楼 · 发布于 2024-04-16 17:46:34

解决方案有两部分。在

其中一部分被称为生产者。生产者是数据产生的对象。TCP传输是一个生产者。生产者有两种有用的方法:pauseProducing和{}。pauseProducing导致传输停止从网络读取数据。resumeProducing使它重新开始读取。这为您提供了一种避免在内存中建立大量尚未处理的数据的方法。当你开始落后的时候,就停下来。等你赶上了,再继续。在

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

你可以read more about producers and consumers in the Twisted documentation。在

相关问题 更多 >