RPC用于多处理,设计问题

时间:2009-08-30 04:09:23

标签: python rpc multiprocessing

在多处理过程中执行rpc的好方法是什么?过程是什么?

我也愿意就以下架构提供建议: 过程A * 10,过程B * 1.每个过程A必须检查过程B是否需要查询特定项目。

所以我在考虑为所有As实现multiprocessing.Pipe()对象,然后让B听取它们中的每一个。但是,我意识到Multiprocessing.Pipe.recv是BLOCKING。所以我真的不知道如何做到这一点。 (如果我使用循环来检查哪一个通过另一端发送的东西将阻止循环)。

我建议使用twisted,但我不确定如何在twisted中执行此操作:我是否应该从所有进程A中创建每个pipe.handler的延迟,然后当recv()收到某些内容时它继续并完成一定程序?我知道个人扭曲与多处理不能很好地混合,但是我已经做了一些关于多处理实现的子进程的扭曲测试,我想这次它是可行的。

有什么建议吗?

3 个答案:

答案 0 :(得分:6)

就个人而言,我总是倾向于倾向于基于套接字的RPC,因为当我需要扩展更多时,这使我从单个节点的限制中解脱出来。 Twisted提供了一种处理基于套接字的通信的好方法,但当然还有其他替代方案。 HTTP 1.1是一个很好的“传输”层,用于此目的,因为它通常可以轻松地传递防火墙,如果您需要安全性,也可以轻松迁移到HTTPS。至于它上面的有效载荷,我可能有点偏心赞成JSON,但与XML或许多其他编码相比,我度过了一段美好时光。虽然我不得不承认,既然谷歌的protobufs已经开源了,它们也很诱人(特别是因为它们是我们内部使用的,几乎完全是 - 一个肯定习惯了它们;-)。遗憾的是,HTTP上的protobufs没有特定的RPC实现是开源的...但是为你自己做一个并不困难; - )。

答案 1 :(得分:1)

我对使用REST-ful交易设计感到满意。

这意味着使用HTTP而不是管道。

如果进程B有各种进程A要做的事情队列,它就会这样工作。

进程B是一个HTTP服务器,具有处理来自进程A的查询的RESTful URI。 B使用Python wsgirefwerkzeug或其他一些WSGI实现来实现。

通常,B响应来自A的GET请求。每个GET请求从队列中取出下一个并响应它。由于B将有多个并发请求,因此某种单线程队列至关重要。确保这一点的最简单方法是确保WSGI服务器是单线程的。每个请求都相对较快,因此单线程处理效果非常好。

B必须加载它的队列,因此它也可能响应POST请求以排队。

进程A是一个HTTP客户端,请求进程B提供的RESTful URI。使用urllib2实现A来发出B的请求.A使得B的GET请求从队列中获取下一个东西。

答案 2 :(得分:0)

你看过MPI了吗? http://en.wikipedia.org/wiki/Message_Passing_Interface

它广泛适用于UNIX / Linux /等。我相信它可以在Windows上使用。基本上它提供了你必须在RPC机制之上构建的所有管道,并且它背后有多年的开发和改进。它是一个API的规范,最初是在C语言中完成的,所以也可以使用C ++,并且也有Python的实现。