刷新Twisted的写缓冲区

突触

Twisted的Connection类继承write了abstract类方法FileDescriptor如您在这里看到的,该类具有一个缓冲区,直到缓冲区的字节总数大于bufferSize(class中的attribute FileDescriptor)时,该缓冲区才会刷新

对于我的特定需求,我想尽快将数据写入套接字,因此我想避免在传输的任何时候对它们进行缓冲。我已设置TCP_NODELAY为套接字,但仍在Twisted的write调用中缓冲数据

因此,我解决此问题的FileDescriptor.doWrite方法是调用方法,该方法将尝试在缓冲区中写入任何数据(请参阅参考资料)。doWrite总是打电话write如下:

...
self.transport.write(data)
self.transport.doWrite()
...

解决方法似乎运行良好,但有时会出现以下错误:

    self.transport.doWrite()  # Flush twisted buffer
File "/usr/local/lib/python2.7/dist-packages/Twisted-14.0.2-py2.7-linux-x86_64.egg/twisted/internet/abstract.py", line 270, in doWrite
    self.stopWriting()
File "/usr/local/lib/python2.7/dist-packages/Twisted-14.0.2-py2.7-linux-x86_64.egg/twisted/internet/abstract.py", line 429, in stopWriting
    self.reactor.removeWriter(self)
File "/usr/local/lib/python2.7/dist-packages/Twisted-14.0.2-py2.7-linux-x86_64.egg/twisted/internet/epollreactor.py", line 344, in removeWriter
    EPOLLOUT, EPOLLIN)
File "/usr/local/lib/python2.7/dist-packages/Twisted-14.0.2-py2.7-linux-x86_64.egg/twisted/internet/epollreactor.py", line 322, in _remove
   primary.remove(fd)
KeyError: 11

问题在于doWrite调用stopWriting试图从中的writers列表中删除自身(Connection对象)reactor出现异常是因为它无法在列表中找到该对象。

这很奇怪,因为write应该在data没有参数的情况下注册读者None(我认为问题是数据有时是None,所以我在存在数据的情况下包含了writedoWrite)。因此,我决定只捕获KeyError异常并忽略它,如下所示:

...
if data:
    self.transport.write(data)
    try:
        self.transport.doWrite()
    except KeyError:
        pass
...

但是,异常会不断弹出,甚至会关闭TCP连接。

我不知道现在在哪里以及为什么引发异常,我不知道doWrite另外,我不知道此骇客有何副作用。可能是我过度简化了Twisted的整个文件描述符范式(我还不太了解)。我也不知道这是否是实际的预期行为,在任何情况下Twisted都不应该在从列表中删除该元素之前先检查该元素是否在作家列表中吗?

让·保罗·卡尔德龙

doWrite不在那里给您打电话。它是运输和反应堆之间界面的一部分。它不是传输和协议之间接口的一部分。

FileDescriptor在写入一定数量的字节之前,不缓冲写操作。它最多仅缓冲写操作,直到反应堆有机会再次运行为止。Twisted是一种协作式多任务系统。一次只发生一件事。如果正在发生的一件事是您的应用程序代码正在运行,那么反应堆将无法完成其工作(例如将字节写入文件描述符)。每件事都必须等待对方完成才能开始。

不管是什么导致您得出基于大小的写缓冲区的结论都是错误的。无论您要解决什么问题,解决方案都不会像这样。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

缓冲区何时刷新

来自分类Dev

C ++刷新缓冲区

来自分类Dev

“关闭设备上的Windows写缓存缓冲区刷新”的全部功能和效果是什么?

来自分类Dev

只读和只写缓冲区

来自分类Dev

输出缓冲区是否自动刷新?

来自分类Dev

结束是否刷新缓冲区

来自分类Dev

输出缓冲区是否自动刷新?

来自分类Dev

刷新TCP接收数据缓冲区?

来自分类Dev

刷新'tail -f'缓冲区?

来自分类Dev

如何刷新SerialDevice的输入缓冲区

来自分类Dev

内核缓冲区的后台刷新

来自分类Dev

Java中的并发读/写缓冲区字节[]

来自分类Dev

写缓冲区溢出漏洞-如何找出shellcode的地址?

来自分类Dev

如何禁用PHP的文件读/写缓冲区?

来自分类Dev

如何不写比C缓冲区更多的字节?

来自分类Dev

如何修改emacs中当前缓冲区的写权限?

来自分类Dev

Java中的并发读/写缓冲区byte []

来自分类Dev

如何减少可移动设备的Linux写缓冲区?

来自分类Dev

选择/轮询和一个写缓冲区

来自分类Dev

写缓冲区溢出漏洞-如何找出shellcode的地址?

来自分类Dev

如何禁用PHP的文件读/写缓冲区?

来自分类Dev

谷歌大查询 - 从缓冲区刷新数据(缓冲区上的 4 天数据)

来自分类Dev

如何“刷新” TCP客户端缓冲区?

来自分类Dev

在Apache / Nginx设置中刷新输出缓冲区

来自分类Dev

\ r和\ n或缓冲区刷新的问题

来自分类Dev

在Node.JS中刷新缓冲区数据

来自分类Dev

每N个字符刷新输出缓冲区

来自分类Dev

“写入缓存缓冲区刷新”是什么意思

来自分类Dev

PHP输出缓冲区刷新,然后清除