我正在尝试编写某种类型的多协议机器人( jabber / irc ),它可以从fifo文件(主要是一行)中读取消息,然后将它们发送到irc通道和jabber联系人。到目前为止,我设法创建了两个工厂来连接jabber和irc,它们似乎正在工作。
然而,我在读取fifo文件时遇到了问题-我不知道如何在反应器循环之外的循环中读取它(打开文件、读取行、关闭文件、跳转到打开文件等等),以获取我需要发送的数据,然后将数据发送到反应器循环,以便在两种协议中发送。我一直在寻找如何以最好的方式做这件事的信息,但我完全迷失在黑暗中。任何建议/帮助都将不胜感激。
提前感谢!
发布于 2010-03-20 00:39:05
你可以在文件描述符上读/写,而不会阻塞反应器,就像你对套接字所做的那样,顺便说一句,套接字不是使用文件描述符吗?
在您的示例中,创建一个实现twisted.internet.interfaces.IReadDescriptor的类,并使用twisted.internet.interfaces.IReactorFDSet.addReader添加到reactor。有关IReadDescriptor实现的示例,请查看twisted.internet.tcp.Connection。
我不能说得更具体了,因为我从来没有自己做过,但我希望这可以成为一个起点。
发布于 2010-03-19 18:25:19
fifo是问题所在。改为从套接字读取。这将更好地适应Twisted事件驱动模型。试图在反应堆控制之外做事情通常是错误的方法。
-基于fifo是外部约束,无法避免的反馈进行更新
好吧,核心问题是你不能在你的Twisted应用程序的主线程(也是唯一的线程)中编写代码,该线程对fifo进行阻塞读取调用。这将导致整个应用程序在没有可读内容的情况下停止。因此,您可能正在考虑异步读取fifo,创建单独的线程来读取它,或者将应用程序一分为二。
最后一个选项是最简单的-修改Twisted应用程序,使其侦听套接字,并编写一个单独的小“转发”应用程序,该应用程序在一个简单的循环中运行,读取fifo并将它听到的所有内容写入套接字。
https://stackoverflow.com/questions/2476234
复制相似问题