Twisted中的新传输和读取器类型

vir*_*tor 2 python architecture protocols twisted transport

我正在尝试向Twisted添加一个新的传输,它将从流中读取数据 - 无论是某种tail -f方式的文件,还是来自管道,但我在使用Twisted体系结构时遇到了一些问题.

我已ITransport准备好传输本身(工具) - 它处理所有文件打开.我已准备好流媒体功能/延迟功能.我现在怎么把它放在一起?我想将新数据报告回一些协议dataReceived().

我当然可以创建一个新对象,它将使用适当的回调设置I/O监视器,在reactor关闭时注册回调(关闭文件/协议)并手动启动所有内容 - 但这是"正确的方法" ?我可以使用更好的抽象吗?我见过reactor.connectWith(),但它并没有真正提供很多抽象......

另外 - 我怎么把数据从我的读者传递到协议?ITransport没有为它定义任何接口,即使它看起来完全是传输的责任.

Jea*_*one 5

听起来你大部分都想知道如何做到这一点.你可能会感兴趣twisted.internet.fdesc.readFromFD,但它只有几行而且它没有做任何特别复杂的事情(尽管你不需要维护几行).除此之外 - 是的,在这种情况下你必须进行I/O监控,因为select/poll/epoll不支持常规文件描述符(它们总是被报告为就绪,而不是你想要的).

在Twisted(http://twistedmatrix.com/trac/ticket/972)中已经完成了支持inotify的一些工作,但这还没有完成,所以它现在不会直接对你有用(除非你想要帮助完成它,然后使用它).假设您只使用基于时间的轮询,反应堆中的大部分内容都无法帮助您,因为该代码专注于使用系统提供的就绪API(即select/poll/epoll)来触发事件.

但是,对于管道箱,您应该能够使用并从中获益IReactorFDSet- addReader等.

您的基于时间的轮询传输仍然可以从实施中受益ITransport- 尽管我不确定如何实现write类似tail -f传输.通过IProtocol接口传输数据肯定会让您受益,因为这样可以简化代码重用. IProtocol.dataReceived正是你想要从你的读者传递数据的方式(我认为这与你的传输相同,不是吗?).这没有定义,ITransport因为它是一个方法,你调用一些不是传输的其他对象.

reactor.connectWith可能不会给你买任何东西.正如你所说,它并不是一个抽象的东西; 我会说这更像是一个错误.:)

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

对于关闭回调,addReader实际上应该让你在那里大部分时间.关机时反应堆中的任何读者都会connectionLost调用它(部分IFileDescriptor).您应该实现此操作来清理文件和协议.