4

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

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

提前致谢!

4

2 回答 2

3

您可以在不阻塞反应器的情况下读取/写入文件描述符,就像使用套接字一样,顺便说一句,套接字不使用文件描述符吗?

在您的情况下,创建一个twisted.internet.interfaces.IReadDescriptor使用twisted.internet.interfaces.IReactorFDSet.addReader. 有关IReadDescriptor实现的示例,请查看twisted.internet.tcp.Connection.

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

于 2010-03-19T16:39:05.117 回答
1

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

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

好的,核心问题是您不能在 Twisted 应用程序的主(也是唯一)线程中编写代码,从而阻止对 fifo 的读取调用。如果没有可阅读的内容,这将导致整个应用程序停止运行。因此,您要么查看异步读取 fifo,创建一个单独的线程来读取它,要么将应用程序分成两部分。

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

于 2010-03-19T10:25:19.227 回答