19

我有一个想法,我想开发一个应用程序,以了解更多关于TwistedWebSockets的信息。我正在考虑将以前编写的 IRC Bot 集成到 Web 应用程序中。据我所知,我需要三个反应器才能使其工作:

  • 主反应器:Web 服务器 (HTTP)。这将是您的平均 twisted.web 应用程序。当你访问它时,你可以 POST 一个 IRC 服务器/频道来连接。然后,Web 服务器将与不同线程中的不同反应器对话,即...
  • 二级反应堆:IRC Bot。这将是一个通过 Twisted IRC 客户端协议运行的 IRC 机器人。它会加入一个频道,每当有人说什么时,它就会获取该数据并将其推送到另一个反应器,在另一个线程上,这是......
  • 第三反应堆:WebSocket 服务器(WS):由于 WebSockets 不使用常规的 HTTP 协议,它们需要自己的服务器(或者看起来是这样,看看这样的例子当 IRC 机器人收到消息时,它告诉 WebSocket服务器将该消息推送到连接的客户端。

在我看来,这是有道理的。这似乎是可能的。有没有人有多个反应器在单独的线程中运行的例子,或者这是我想象的在当前的 Twisted 化身中无法完成的事情。

是否可以(或应该)进行任何架构更改以最小化反应器数量等?

谢谢你的帮助。

4

2 回答 2

20

幸运的是,很容易将反应器的数量减少到 1:

在任何给定的 Twisted 进程中,您只能在单个线程中拥有一个反应器。如果你试图拥有更多,什么都行不通。

实际上,反应器的全部意义在于促进将多个事件源组合到单个线程中。如果你想用 3 种不同的协议监听 3 个不同的端口,你的应用程序可能如下所示:

from twisted.internet import reactor
reactor.listenTCP(4321, FirstProtocolFactory())
reactor.listenTCP(5432, SecondProtocolFactory())
reactor.listenTCP(6543, ThirdProtocolFactory())
reactor.run()

当然,您可能实际上并没有直接调用自己,因为如果您正在使用,listenTCP您可能希望通过文件或插件来使用Service对象。而且你不需要打电话给自己,如果是为你做的。我的观点是,无论通过什么方式,你都可以在反应堆中加载你期望它响应的所有事件——监听服务器、客户端连接、定时事件——它会在每个事件发生时做出反应。(因此,“反应堆”。)twisted.application.internettwistd.tactwistdreactor.run()twistd

有关 what FirstProtocolFactorySecondProtocolFactoryThirdProtocolFactoryshould be 的具体值,请参阅 pyfunc 答案中的链接。

于 2010-11-03T10:25:57.703 回答
5

不,我认为您不需要多个反应器。

您需要的是一个多服务多协议应用程序。这就是 Twisted 真正闪耀的地方。

所以你的应用程序应该启动一个 Web 服务、IRC Bot 服务和 WebSocket 服务器。

使用twisted应用服务框架,专门启动一个多服务

查看 IRC 机器人实现和扭曲的 IRC 协议支持:

对于 websocket 和 twisted

于 2010-11-03T04:05:53.133 回答