多处理模块和pyro的比较?

我使用pyro进行计算群集上并行作业的基本管理。 我刚搬到集群,我将负责使用每个计算节点上的所有核心。 (在之前的集群中,每个核心都是一个单独的节点。)python多处理模块似乎非常适合这一点。 我注意到它也可以用于远程过程通信。 如果有人使用这两个框架进行远程过程通信,我会很高兴听到他们如何相互对抗。 多处理模块的显着优势在于它内置了2.6。 除此之外,我很难分辨哪个更好。


编辑:我改变我的答案,所以你避免疼痛。 多是不成熟的,对BaseManager的文档是不正确的 ,如果你是一个面向对象的思想家想要在运行时动态创建的共享对象, 请使用PYRO或者你慎重后悔! 如果您只是使用共享队列进行函数式编程,那么您可以像所有愚蠢的示例一样注册。

简答

多:

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

  • 简单的远程对象
  • 仅限网络通信(仅限本地环回)
  • 编辑:这个东西只是工作,它喜欢面向对象的对象共享,这让我喜欢它
  • 编辑:为什么不是这个标准库的一部分,而不是那个试图拷贝它并且失败惨败的多处理垃圾?
  • 编辑:我第一次回答这个问题时,我刚刚进入2.6多处理。 在下面显示的代码中,Texture类是作为代理注册和共享的,但其内部的“data”属性不是。 所以猜猜会发生什么,尽管你可能期望什么,但每个进程在Texture代理内部都有一个单独的“data”属性副本。 我花了数不清的时间试图弄清楚在运行时如何创建共享对象的好模式,并且我一直跑到砖墙。 这令人感到困惑和沮丧。 也许这只是我,但环顾四周,人们尝试的例子并不是这样。

    我不得不做出放弃多处理库的痛苦决定,并倾向于使用Pyro,直到多处理更成熟。 虽然最初我很兴奋地学习python中内置的多处理技术,但现在我对它感到非常反感,并且宁愿多次安装Pyro软件包,因为这样一个漂亮的python库存在。

    长答案

    我在过去的项目中使用过Pyro,并对它感到非常满意。 我还开始使用2.6中的多处理新功能。

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

    例如:

    manager.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
    

    server.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()
    

    client.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遇到这种尴尬,但可能有一个比上面的例子更清洁的解决方案。

    链接地址: http://www.djcxy.com/p/46469.html

    上一篇: Comparison of the multiprocessing module and pyro?

    下一篇: Sharing a complex object between Python processes?