混合Python Twisted与多处理?

时间:2011-04-19 10:49:50

标签: python twisted multiprocessing

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

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

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

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

3 个答案:

答案 0 :(得分:17)

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

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

答案 1 :(得分:4)

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

这是一个简单的流程池实现,它使用AMP protocol进行通信。您可以使用deferToAMPProcess功能,它非常易于使用。

答案 2 :(得分:0)

您可以尝试使用合作多任务技术,如http://us.pycon.org/2010/conference/schedule/event/73/所述。这与技术相似,因为雕文被推,并且值得一试。

你可以尝试将ZeroMQ与Twisted一起使用,但现在真的很难实验:)