Python Twisted中的新传输和读卡器类型

Python Twisted中的新传输和读卡器类型,python,architecture,twisted,protocols,transport,Python,Architecture,Twisted,Protocols,Transport,我正在尝试向Twisted添加一个新的传输,它将从一个流中读取数据—或者是以tail-f的方式读取文件,或者是从一个管道读取数据,但是Twisted体系结构存在一些问题 我已经准备好了传输本身(实现ITransport),它处理所有文件打开。我已经准备好了流媒体功能/延迟。现在我该如何组合它呢?我想将新数据报告回一些协议的dataReceived() 当然,我可以创建一个新的对象,用适当的回调设置I/O监视器,在反应堆关闭时注册回调(以关闭文件/协议),并手动启动所有东西——但这是“正确的方法”

我正在尝试向Twisted添加一个新的传输,它将从一个流中读取数据—或者是以
tail-f
的方式读取文件,或者是从一个管道读取数据,但是Twisted体系结构存在一些问题

我已经准备好了传输本身(实现
ITransport
),它处理所有文件打开。我已经准备好了流媒体功能/延迟。现在我该如何组合它呢?我想将新数据报告回一些协议的
dataReceived()

当然,我可以创建一个新的对象,用适当的回调设置I/O监视器,在反应堆关闭时注册回调(以关闭文件/协议),并手动启动所有东西——但这是“正确的方法”吗?有没有更好的抽象概念我可以用?我看过reactor.connectWith(),但它并没有提供太多的抽象


还有-我应该如何将数据从我的阅读器传递到协议?ITransport没有为它定义任何接口,尽管它似乎正是传输的责任。

听起来您已经大致了解了如何做到这一点。您可能对twisted.internet.fdesc.readFromFD感兴趣,但它只有几行长,并且没有做任何特别复杂的事情(不过有几行您不必维护)。除此之外-是的,在这种情况下您必须进行I/O监视,因为select/poll/epoll不支持常规文件描述符(它们总是报告为就绪,而不是您想要的)

在Twisted()中支持inotify已经做了一些工作,但这还没有完成,所以它现在对您没有直接的帮助(除非您想帮助完成它,然后使用它)。假设您只使用基于时间的轮询,那么反应器中的大部分内容将不会对您有多大帮助,因为该代码侧重于使用系统提供的就绪API(即select/poll/epoll)来触发事件

不过,对于管道案例,您应该能够使用
IReactorFDSet
的方法-
addReader
等,并从中获益

您基于时间的轮询传输可能仍然会受益于实现
ITransport
——尽管我不确定如何为
tail-f
类传输实现
write
。通过
IProtocol
接口传输数据肯定会让您受益匪浅,因为这简化了代码重用
IProtocol.dataReceived
正是您希望从阅读器传递数据的方式(我认为这与您的传输方式相同,不是吗?)。这并不是在ITransport上定义的,因为它是一种方法,您可以调用其他非传输对象

reactor.connectWith
可能不会给你买任何东西。正如你所说,这不是一个抽象的概念;我认为这更像是一个错误

不要太担心不能将方法直接添加到反应器中。接受反应器作为参数的自由函数同样易于使用

对于关机回调,
addReader
实际上应该可以让您完成大部分工作。停堆时反应堆中的任何读卡器都将调用
connectionLost
(属于
IFileDescriptor
的一部分)。您应该实现这一点来清理文件和协议