2011-04-19 88 views
10

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

为了尽量减少工作量,我想使用Python Twisted来处理请求接收(该部分充当服务器)和重新发送(该部分充当客户端)。为了获得最大的性能,我想使用python multiprocessing(线程具有GIL限制)将程序分成三个部分(进程)。第一个进程运行Twisted接收请求,将请求放入队列中,并立即返回成功到原始客户端。第二个进程从队列中获取请求,进一步处理请求并将其放入另一个队列。第三个进程从第二个队列获取请求并将其发送到原始服务器。

我是Python的新角色Twisted,我知道它是事件驱动的,我也听说最好不要将Twisted与线程或多处理混合在一起。所以我不知道这种方式是否合适,或者是否有更简单的方法,只需使用Twisted?

+0

我怀疑使用3个进程,而不是1是多余的。第一个和最后一个进程不会执行任何CPU绑定处理......它们只是IO绑定。通过实际将所有内容放入一个没有线程和只有异步/事件库逻辑的Twisted reactor进程中,您可能会获得更好的可维护性和更好的执行结果。 – 2012-03-22 13:43:10

回答

4

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

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

17

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

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

+0

这似乎是我预期的答案,谢谢雕文。不过,我仍然在学习Twisted,并不完全理解你提到的术语,如Twisted的“spawnProcess”或“callFromThread”,我会回过头来让你知道我什么时候开始编写代码。 – benhengx 2011-04-20 09:12:57

+1

'spawnProcess'总是一个链接,但现在'callFromThread'也是。他们会带你到Twisted API文档,希望能够清楚说明它们的含义:)。 – Glyph 2011-05-16 13:14:26

+1

比api文档更具亲和力的文档:[使用流程](https://twistedmatrix.com/documents/current/core/howto/process.html) – jfs 2014-05-09 02:01:18