0

跨 multiprocessing.Process'es 执行 rpc 的好方法是什么?

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

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

有人建议我使用twisted,但我不确定我应该如何在twisted 中执行此操作:我是否应该在所有进程A 的每个pipe.handler 上创建一个defer,然后当recv() 接收到它继续进行时并完成一定的套路?我个人知道twisted 不能很好地与多处理混合,但是我已经对作为多处理实现的子进程的twisted 进行了一些测试,我认为这次它是可行的。

有什么建议吗?

4

3 回答 3

6

就我个人而言,我总是倾向于使用基于套接字的 RPC,因为如果我需要扩展更多,这让我摆脱了单个节点的限制。Twisted 提供了一种处理基于套接字的通信的好方法,但当然还有其他选择。HTTP 1.1 是用于此类目的的出色“传输”层,因为它通常可以轻松通过防火墙,如果您也需要安全性,也可以轻松迁移到 HTTPS。至于在它上面的有效负载,我可能有点偏爱 JSON,但与 XML 或许多其他编码相比,我玩得很开心。虽然我不得不承认,现在 Google 的protobufs已经开源,它们也很诱人(特别是因为它们是我们内部使用的,几乎完全是 - 肯定会习惯它们;-)。遗憾的是,没有基于 HTTP 的 protobufs 的特定 RPC 实现是开源的……但为自己做一个并不难;-)。

于 2009-08-30T04:34:10.860 回答
1

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

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

于 2009-10-14T21:57:29.377 回答
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 发出请求。A 使用urllib2向 B 发出请求。A 向 B 发出 GET 请求以从队列中获取下一个事物。

于 2009-08-30T11:41:22.560 回答