2010-03-19 56 views
4

我试着写一些一种多协议BOT(叽里咕噜/ IRC),将读取FIFO文件的消息(一个衬垫大部分),然后将它们发送到irc频道和jabber联系人。到目前为止,我设法创建了两个工厂来连接到jabber和irc,并且他们似乎在工作。的Python(双绞线) - 从FIFO读,读出的数据发送给多个协议

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

提前致谢!

回答

1

FIFO是问题所在。改为从套接字读取。这将更适合Twisted事件驱动模型的信息。试图在反应堆控制之外做事通常是错误的做法。

----更新基于反馈FIFO为外部约束,无法避免----

OK,中心问题是,你不能在(仅)主线程编写代码你的Twisted应用阻止了对fifo的读取调用。如果没有可读的内容,这将导致整个应用程序失速。所以你要么在不同步读取fifo,要么创建一个单独的线程来读取它,要么将应用程序分成两部分。

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

+0

问题是我没有控制数据的来源。它已经以fifo形式提供,这是我必须与之合作的内容。我可能会问,如果真的没有其他方式来获得这些数据,但直到我得到答案,它的fifo。 – SpankMe 2010-03-19 10:44:26

3

您可以读写文件描述符,而不会像使用套接字一样阻塞反应堆,通过套接字不使用文件描述符的方式?

你的情况创建一个类,实现twisted.internet.interfaces.IReadDescriptor并添加到使用twisted.internet.interfaces.IReactorFDSet.addReader反应堆。有关IReadDescriptor实施的示例,请参阅twisted.internet.tcp.Connection

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