一个应用中的多个反应器(主回路)通过螺纹(或替代方式)

时间:2010-11-03 03:56:38

标签: python multithreading events twisted reactor

我已经了解了一个应用程序,我想继续学习TwistedWebSockets。我正在考虑将以前编写的IRC Bot集成到Web应用程序中。据我所知,我需要三个反应器才能使其发挥作用:

  • 主要反应堆:Web服务器(HTTP)。这将是你的平均twisted.web应用程序。当您访问它时,您可以将IRC服务器/通道POST到连接。然后,Web服务器将与不同线程中的不同反应器通信,这是......
  • 二级反应堆:IRC Bot。这将是通过Twisted IRC客户端协议运行的IRC机器人。它会加入一个频道,每当说出某些内容时,就会把这些数据推送到另一个反应堆,在另一个线程上,这是......
  • 第三级反应堆:WebSocket服务器(WS):由于WebSockets不使用常规HTTP协议,因此它们需要自己的服务器(或者看起来如此,查看{{3}等示例当IRC机器人收到消息时,它会告诉WebSocket服务器将该消息推送到已连接的客户端。

在我看来,这是有道理的。似乎有可能。有没有人有任何在不同线程中运行的多个反应堆的例子,或者这是我想象的那些在扭曲的当前版本中无法完成的事情。

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:19)

幸运的是,很容易减少反应堆的数量,特别是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.internet中的twistd个对象,一个.tac文件或twistd插件。如果reactor.run()正在为您执行此操作,则您无需亲自致电twistd。我的观点是,通过任何方式,您可以使用您希望它作出反应的所有事件来加载反应堆 - 侦听服务器,客户端连接,定时事件 - 并且它将在每个事件发生时作出反应。 (因此,“反应堆”。)

有关FirstProtocolFactorySecondProtocolFactoryThirdProtocolFactory应具体的具体值,请参阅pyfunc答案中的链接。

答案 1 :(得分:5)

  

不,我认为你不需要多个反应堆。

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

因此,您的应用程序应该启动Web服务,IRC Bot服务和WebSocket服务器。

  

使用扭曲的应用程序服务框架,特别是启动多服务

查看IRC bot实现和扭曲的IRC协议支持:

和websocket and twisted