【问题标题】:Python (Twisted) - reading from fifo and sending read data to multiple protocolsPython (Twisted) - 从 fifo 读取并将读取数据发送到多个协议
【发布时间】:2011-01-29 09:26:41
【问题描述】:

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

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

提前致谢!

【问题讨论】:

    标签: python twisted xmpp irc fifo


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 问题是我无法控制数据的来源。它以 fifo 形式提供,这是我必须使用的。我可能会问,如果真的没有其他方法可以获取该数据,但在我得到答案之前,它的 fifo。
    【解决方案2】:

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

    在您的情况下,创建一个实现twisted.internet.interfaces.IReadDescriptor 的类并使用twisted.internet.interfaces.IReactorFDSet.addReader 添加到反应器。有关IReadDescriptor 实现的示例,请查看twisted.internet.tcp.Connection。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多