【问题标题】:Mix Python Twisted with multiprocessing?将 Python Twisted 与多处理混合使用?
【发布时间】:2011-04-19 10:49:50
【问题描述】:

我需要用 Python 编写一个类似代理的程序,工作流程与 Web 代理非常相似。该程序位于客户端和服务器之间,接收客户端向服务器发送的请求,处理请求,然后将其发送到原始服务器。当然使用的协议是私有协议,使用TCP。

为了尽量减少工作量,我想使用 Python Twisted 来处理请求接收(部分充当服务器)和重新发送(部分充当客户端)。

为了最大化性能,我想使用 python 多处理(线程有 GIL 限制)将程序分成三个部分(进程)。第一个进程运行 Twisted 接收请求,将请求放入队列,并立即向原始客户端返回成功。第二个进程从队列中获取请求,进一步处理请求并将其放入另一个队列。第三个进程从第二个队列中获取请求并将其发送到原始服务器。

我是 Python Twisted 的新手,我知道它是事件驱动的,我还听说最好不要将 Twisted 与线程或多处理混合使用。所以我不知道这种方式是否合适或者仅使用Twisted是否有更优雅的方式?

【问题讨论】:

  • 我怀疑使用 3 个进程而不是 1 个进程是多余的。无论如何,第一个和最后一个进程不执行任何 CPU 绑定处理......它们只是 IO 绑定。通过将所有内容实际放入一个没有线程且只有异步/基于事件的逻辑的单一 Twisted reactor 进程中,您可能会获得更易于维护和性能更好的结果。

标签: python twisted multiprocessing


【解决方案1】:

Twisted 有自己的事件驱动的运行子进程的方式(在我看来是正确的,但谦虚)比multiprocessing 模块更好。核心 API 是 spawnProcess,但像 ampoule 这样的工具提供了更高级别的包装器。

如果您使用spawnProcess,您将能够像处理 Twisted 中的任何其他事件一样处理子进程的输出;如果您使用multiprocessing,您将需要开发自己的基于队列的方法,以某种方式从子进程获取输出到 Twisted 主循环,因为线程可能使用的普通callFromThread API 不适用于另一个进程.根据你如何称呼它,它要么尝试腌制反应器,要么只是在子进程中使用不同的非工作反应器;无论哪种方式,它都会永远失去你的电话。

【讨论】:

  • 这似乎是我所期望的答案,谢谢 Glyph。不过我还在学习 Twisted,不太明白你提到的 Twisted 中的 'spawnProcess' 或 'callFromThread' 是什么意思,我会在开始编码时回来告诉你。
  • spawnProcess 一直是一个链接,但现在callFromThread 也是。他们会带你去 Twisted API 文档,希望这能让你清楚他们的目的:)。
  • 比 api 文档更平易近人的文档:Using Processes
【解决方案2】:

ampoule 是我在阅读您的问题时首先想到的。

这是一个简单的进程池实现,它使用AMP protocol 进行通信。可以使用deferToAMPProcess函数,非常好用。

【讨论】:

    【解决方案3】:

    您可以尝试像 http://us.pycon.org/2010/conference/schedule/event/73/ 中描述的协作多任务技术。与 Glyph 提到的技术类似,值得一试。

    您可以尝试将 ZeroMQ 与 Twisted 一起使用,但现在它真的很难并且是实验性的 :)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-02
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 2015-12-23
      • 2013-12-13
      相关资源
      最近更新 更多