Python(Twisted)-从fifo读取数据并将读取的数据发送到多个协议

Python(Twisted)-从fifo读取数据并将读取的数据发送到多个协议,python,twisted,xmpp,irc,fifo,Python,Twisted,Xmpp,Irc,Fifo,我正在尝试编写某种多协议bot(jabber/irc),它可以从fifo文件(主要是一行程序)读取消息,然后将它们发送到irc通道和jabber联系人。到目前为止,我设法创建了两个工厂来连接jabber和irc,它们似乎正在工作 然而,我在读取fifo文件时遇到了问题——我不知道如何在反应堆循环之外的循环(打开文件、读取行、关闭文件、跳转到打开文件等)中读取它,以获取我需要发送的数据,然后将该数据发送到反应堆循环,以便在两个协议中发送。我一直在寻找如何以最好的方式做这件事的信息,但我完全迷失在黑

我正在尝试编写某种多协议bot(jabber/irc),它可以从fifo文件(主要是一行程序)读取消息,然后将它们发送到irc通道和jabber联系人。到目前为止,我设法创建了两个工厂来连接jabber和irc,它们似乎正在工作

然而,我在读取fifo文件时遇到了问题——我不知道如何在反应堆循环之外的循环(打开文件、读取行、关闭文件、跳转到打开文件等)中读取它,以获取我需要发送的数据,然后将该数据发送到反应堆循环,以便在两个协议中发送。我一直在寻找如何以最好的方式做这件事的信息,但我完全迷失在黑暗中。如有任何建议/帮助,将不胜感激


提前谢谢

先进先出是个问题。而是从套接字读取。这将更适合Twisted事件驱动模型。试图在反应堆控制之外做事情通常是错误的做法

----根据反馈进行更新,即fifo是一个外部约束,无法避免----

好的,核心问题是你不能在Twisted应用程序的主线程(也是唯一一个)中编写代码来阻止对fifo的读调用。如果没有可读取的内容,则会导致整个应用程序暂停。因此,您可以考虑异步读取fifo,创建单独的线程来读取fifo,或者将应用程序一分为二


最后一个选项是最简单的-修改Twisted应用程序,使其在套接字上侦听,并编写一个单独的小“转发器”应用程序,在一个简单的循环中运行,读取fifo并将它听到的所有内容写入套接字。

您可以在文件描述符上读/写,而无需像处理套接字那样阻塞反应器,顺便问一下,套接字不使用文件描述符吗

在您的例子中,创建一个实现
twisted.internet.interfaces.ireadderscript
的类,并使用
twisted.internet.interfaces.IReactorFDSet.addReader
将其添加到reactor。有关
IReadDescriptor
实现的示例,请查看
twisted.internet.tcp.Connection


我不能说得更具体,因为我自己从来没有这样做过,但我希望这可以成为一个起点。

问题是我无法控制数据的来源。它已经提供了先进先出的形式,这是我必须与之合作。我可能会问,是否真的没有其他方法来获取这些数据,但在我得到答案之前,是fifo。