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

Mik*_*cic 19 python events multithreading twisted reactor

我已经知道了一个应用程序,我想继续学习更多关于TwistedWebSockets的知识.我正在考虑将以前编写的IRC Bot集成到Web应用程序中.据我所知,我需要三个反应器来使它工作:

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

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

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

谢谢你的帮助.

Gly*_*yph 20

幸运的是,很容易减少反应堆的数量,具体来说,减少到1:

在任何给定的Twisted过程中,您只能在单个线程中拥有一个单个反应器.如果你想要更多,没有什么可行的.

实际上,反应堆的重点是促进将多个事件源组合成一个线程.如果您想使用3种不同的协议监听3个不同的端口,您的应用程序可能如下所示:

from twisted.internet import reactor
reactor.listenTCP(4321, FirstProtocolFactory())
reactor.listenTCP(5432, SecondProtocolFactory())
reactor.listenTCP(6543, ThirdProtocolFactory())
reactor.run()
Run Code Online (Sandbox Code Playgroud)

当然,你可能实际上并没有listenTCP直接打电话给你自己,因为你可能想要使用Service来自twisted.application.internettwistd.tac文件或twistd插件.reactor.run()如果twistd是为你做的话,你就不需要打电话给自己了.我的观点是,通过任何方式,您可以使用您希望它作出反应的所有事件来加载反应堆 - 侦听服务器,客户端连接,定时事件 - 并且它将在每个事件发生时作出反应.(因此,"反应堆".)

对于什么FirstProtocolFactory,SecondProtocolFactoryThirdProtocolFactory应该是什么的具体值,请参阅pyfunc答案中的链接.


pyf*_*unc 5

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

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

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

使用扭曲的应用程序服务框架,专门启动多服务

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

并用于websocket和twisted