8 年后,这仍然是 ET EPoll with twisted 搜索结果的顶部,所以这是我确定的解决方案。请注意,这是“标签外”,因为它是扭曲本身的扩展。如果您破坏了它,请不要纠缠扭曲的作者寻求帮助。首先是代码:
from twisted.internet.epollreactor import EPollReactor
from select import EPOLLET, EPOLLIN, EPOLLOUT
class EPETReactor(EPollReactor):
epflags = EPOLLIN
def addReader(self, reader):
try:
self._add(reader, self._reads, self._writes, self._selectables,
self.epflags, EPOLLOUT)
except IOError as e:
if e.errno == errno.EPERM:
self._continuousPolling.addReader(reader)
else:
raise
def startET(self):
self.epflags = EPOLLIN | EPOLLET
def stopET(self):
self.epflags = EPOLLIN
请注意,这仍然涉及到twisted 的非公共API,但它允许您在一个地方这样做,无论您需要在哪里添加ET FD。如果 twisted 的内部变化足以破坏您的代码,您只需在此处修复它。此外,不会有任何事件未触发的边缘情况,因为事件在您添加 FD 和将其设置为 ET 模式之间到达。
另请注意,我们不只是一直强制 ET 模式,因此您可以在切换到 ET 模式之前配置所需的任何 FD。
用例
如果您正在通过套接字读取MSG_PEEK
并且只有一半的标头已到达,则选择是在套接字上忙于旋转和使用边缘触发模式(或从套接字读取并弄清楚如何将片段与文件一起发送) -descriptor 到其目的地,但这并不总是可能的)。