代码之家  ›  专栏  ›  技术社区  ›  Mike Trpcic

通过线程(或其他方式)在一个应用程序中使用多个反应器(主回路)

  •  18
  • Mike Trpcic  · 技术社区  · 14 年前

    我有一个关于应用程序的想法,我想进一步了解 Twisted WebSockets . 我正在考虑将以前编写的IRC Bot集成到web应用程序中。据我所见,我需要三个反应堆才能让它工作:

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

    在我看来,这是有道理的。看来这是可能的。有没有人举过多个反应器在不同线程中运行的例子,或者这是我想象中的在Twisted的当前版本中做不到的事情。

    谢谢你的帮助。

    2 回复  |  直到 14 年前
        1
  •  20
  •   Glyph    14 年前

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

    你只能有一个反应器,在一个线程,在任何给定的扭曲过程。如果你想拥有更多,什么也做不到。

    实际上,一个反应器的全部目的是促进将多个事件源组合成一个线程。如果要使用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 文件或 扭曲的 插件。你不需要打电话 reactor.run() 扭曲的 是为了你。我在这里的观点是,不管用什么方法,你都可以把你期望的所有事件——监听服务器、客户端连接、定时事件——加载到反应器中,它会在每一个事件发生时做出反应。(因此,“反应堆”。)

    FirstProtocolFactory , SecondProtocolFactory ThirdProtocolFactory 应该是,请参阅pyfunc的答案中的链接。