python - 多处理模块和pyro的比较?

标签 python rpc multiprocessing pyro

我使用 pyro用于计算集群上并行作业的基本管理。我刚搬到一个集群,在那里我将负责使用每个计算节点上的所有内核。 (在以前的集群中,每个核心都是一个单独的节点。)python multiprocessing模块似乎很适合这个。我注意到它也可以用于 remote-process communication .如果有人使用这两种框架进行远程进程通信,我将很高兴听到它们如何相互比较。 multiprocessing 模块的明显好处是它是从 2.6 开始内置的。除此之外,我很难说哪个更好。

最佳答案

编辑:我正在改变我的答案,这样你就可以避免痛苦。 multiprocessing 不成熟,BaseManager 上的文档不正确,如果你是一个面向对象的思想家,想在运行时即时创建共享对象,使用 PYRO 否则你会严重遗憾!如果您只是使用共享队列进行函数式编程,您可以像所有愚蠢的示例一样预先注册,这对您来说非常好。

简答

多处理:

  • 感觉做面向对象的远程对象很尴尬
  • 简单易用的加密(authkey)
  • 通过网络或进程间通信
  • 没有像 Pyro 那样的名称服务器额外麻烦(有办法解决这个问题)
  • 编辑一旦管理器被实例化就不能“注册”对象!!??
  • 编辑:如果服务器没有启动,客户端会抛出一些“无效参数”异常,而不是仅仅说“连接失败”WTF!?
  • 编辑:BaseManager 文档不正确!没有“开始”的方法!?!
  • 编辑:关于如何使用它的示例很少。

火焰兵:

  • 简单的远程对象
  • 仅网络通信(如果仅本地则环回)
  • 编辑:这个东西很管用,它喜欢面向对象的对象共享,这让我喜欢它
  • 编辑:为什么这不是标准库的一部分,而是试图复制它但惨遭失败的多处理废话?

编辑: 第一次回答这个问题时,我刚刚深入研究了 2.6 多处理。在我下面显示的代码中,Texture 类作为代理注册和共享,但其中的“数据”属性不是。所以猜猜会发生什么,每个进程在纹理代理内部都有一个单独的“数据”属性副本,尽管您可能会这样。我只是花了数不清的时间试图找出在运行时创建共享对象的良好模式,我一直在碰砖墙。这一直很令人困惑和沮丧。也许只有我一个人是这样认为的,但环顾四周人们尝试过的为数不多的例子,它看起来并不像。

在多处理更加成熟之前,我不得不做出放弃多处理库并更喜欢 Pyro 的痛苦决定。虽然最初我很高兴学习 python 中内置的多处理,但现在我对它感到非常厌恶,宁愿多次安装 Pyro 包,并为 python 存在如此漂亮的库感到高兴。

长答案

我在过去的项目中使用过 Pyro,并且对它非常满意。我也开始使用 2.6 中的新多处理。

对于多处理,我发现允许根据需要创建共享对象有点尴尬。看起来,在它年轻的时候,多处理模块更适合函数式编程而不是面向对象。然而,这并不完全正确,因为这是可能的,我只是觉得受到“注册”电话的限制。

例如:

管理器.py:

from multiprocessing import Process
from multiprocessing.managers import BaseManager

class Texture(object):
   def __init__(self, data):
        self.data = data

   def setData(self, data):
      print "Calling set data %s" % (data)
      self.data = data

   def getData(self):
      return self.data

class TextureManager(BaseManager):
   def __init__(self, address=None, authkey=''):
      BaseManager.__init__(self, address, authkey)
      self.textures = {}

   def addTexture(self, name, texture):
      self.textures[name] = texture

   def hasTexture(self, name):
      return name in self.textures

服务器.py:

from multiprocessing import Process
from multiprocessing.managers import BaseManager
from manager import Texture, TextureManager

manager = TextureManager(address=('', 50000), authkey='hello')

def getTexture(name):
   if manager.hasTexture(name):
      return manager.textures[name]
   else:
      texture = Texture([0]*100)
      manager.addTexture(name, texture)
      manager.register(name, lambda: texture)

TextureManager.register("getTexture", getTexture)


if __name__ == "__main__":
   server = manager.get_server()
   server.serve_forever()

客户端.py:

from multiprocessing import Process
from multiprocessing.managers import BaseManager
from manager import Texture, TextureManager

if __name__ == "__main__":
   manager = TextureManager(address=('127.0.0.1', 50000), authkey='hello')
   manager.connect()
   TextureManager.register("getTexture")
   texture = manager.getTexture("texture2")
   data = [2] * 100
   texture.setData(data)
   print "data = %s" % (texture.getData())

我所描述的尴尬来自 server.py,我在其中注册了一个 getTexture 函数以从 TextureManager 检索具有特定名称的函数。在我讨论这个问题时,如果我将 TextureManager 设为创建/检索可共享纹理的可共享对象,可能会消除这种尴尬。嗯,我还在玩,但你明白了。我不记得在使用 pyro 时遇到过这种尴尬,但可能有一个比上面的例子更简洁的解决方案。

关于python - 多处理模块和pyro的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1171767/

相关文章:

Erlang远程过程调用模块内部结构

rpc - 我们可以使用 NodeJs 与 corda 进行 RPC 连接吗?

java - 如何使用 Thrift 在 RPC 中传播通用异常?

python - 使用python的multiprocessing和process defunc进行并行编程

python - 在 webapp2 中,如何获取所有路由 URI 的列表?

Python:在//正则表达式之间返回一个字符串

python - 如何在多处理器系统上生成并行子进程?

windows - IBM API 的 Python 多处理错误(Q Experience)

python - Azure Functions Python 中的错误响应

Python while 循环在快速排序期间卡住