我想开发一个应用程序,以便进一步了解 Twisted和 WebSockets .我正在考虑将以前编写的 IRC Bot 集成到 Web 应用程序中。据我所知,我需要三个 react 器才能使其工作:
- 主 react 器:Web 服务器 (HTTP)。这将是您的平均 twisted.web 应用程序。当你访问它时,你可以 POST 一个 IRC 服务器/ channel 来连接。然后,Web 服务器将与不同线程中的不同 react 器通信,即...
- 二级 react 堆:IRC Bot。这将是一个通过 Twisted IRC 客户端协议(protocol)运行的 IRC 机器人。它会加入一个 channel ,每当有人说什么时,它就会获取该数据并将其推送到另一个 react 器,在另一个线程上,即......
- Tertiary Reactor:WebSocket 服务器 (WS):由于 WebSocket 不使用常规的 HTTP 协议(protocol),它们需要自己的服务器(或者看起来像 this 等示例。当 IRC 机器人收到一条消息时,它会告诉 WebSocket 服务器将该消息推送到连接的客户端。
在我看来,这是有道理的。这似乎是可能的。有没有人有多个 react 器在不同线程中运行的示例,或者这是我想象的在当前的 Twisted 化身中无法完成的事情。
是否可以(或应该)进行任何架构更改以最小化 react 器数量等?
感谢您的帮助。
最佳答案
你很幸运,很容易将 react 器的数量减少到 1 个:
在任何给定的 Twisted 进程中,您只能在单个线程中拥有一个 react 器。如果你想拥有更多,什么都行不通。
实际上, react 器的全部意义在于促进将多个事件源组合到一个线程中。如果您想使用 3 种不同的协议(protocol)监听 3 个不同的端口,您的应用程序可能如下所示:
from twisted.internet import reactor
reactor.listenTCP(4321, FirstProtocolFactory())
reactor.listenTCP(5432, SecondProtocolFactory())
reactor.listenTCP(6543, ThirdProtocolFactory())
reactor.run()
当然,您可能实际上并没有自己直接调用 listenTCP
,因为您可能想使用 twisted.application.internet
中的 Service
对象> 如果您使用 twistd
,可以通过 .tac
文件或 twistd
插件。如果 twistd
正在为你做,你不需要自己调用 reactor.run()
。我的观点是,无论通过什么方式,你都可以在 react 堆中加载你期望它响应的所有事件——监听服务器、客户端连接、定时事件——它会在每个事件发生时使用react。 (因此,“ react 堆”。)
FirstProtocolFactory
、SecondProtocolFactory
和 ThirdProtocolFactory
的具体值,请参见 pyfunc 答案中的链接。
关于python - 通过线程(或替代方式)在一个应用程序中使用多个 react 器(主循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084090/