python - 通过线程(或替代方式)在一个应用程序中使用多个 react 器(主循环)

标签 python multithreading events twisted reactor

我想开发一个应用程序,以便进一步了解 TwistedWebSockets .我正在考虑将以前编写的 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 堆”。)

FirstProtocolFactorySecondProtocolFactoryThirdProtocolFactory 的具体值,请参见 pyfunc 答案中的链接。

关于python - 通过线程(或替代方式)在一个应用程序中使用多个 react 器(主循环),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4084090/

相关文章:

javascript - 如何封装对象属性以便以前的对象不被接管? (原型(prototype)/闭合。)

c++ - 来自 C++ 的 Python 回溯

python - Django - 从 django admin 编辑模板

C# 在多线程应用程序中交换变量引用时需要锁定

python - 为什么 PyGILState_Release(...) 在这种情况下会出现段错误?

javascript - jQuery focusin 事件 : Why is event. 数据为空?

python - 识别文本之间的字符串值

python - 依赖 Python 函数参数评估顺序是否安全?

java - 遍历集合时如何防止嵌套同步块(synchronized block)

javascript - 在 event.preventDefault 之后触发事件