【问题标题】:Python Objects in Multiprocessing多处理中的 Python 对象
【发布时间】:2017-03-07 14:56:58
【问题描述】:

我正在用一个简单的程序测试 python 多处理:

 class MyTest:
    def __init__(self):
        self.myattr = 1

    def myfunc(self):
        print(self)
        self.myattr=2
        print(self)
        print("in proc"+str(self.myattr))



def main():

    test = MyTest()
    print(test)
    myProc = Process(target = test.myfunc,args=())

    myProc.start()
    myProc.join()
    print(test.myattr)

main()

进程运行的方法中self的输出与main中的对象的地址相同,我觉得很奇怪,因为它们是独立的进程。但是,由于它们位于相同的地址,它们实际上是跨进程共享的,并且更新 myfunc 中的属性 myattr 应该会更改 main 中 test 的 attr。然而print(test.myattr) 仍然打印 1 即使在进程完成更新test 的属性之后。

我的第一个问题是为什么不同进程中的这两个对象共享相同的地址,我的第二个问题是如果它们确实共享相同的地址,为什么一个进程中的更改不能被另一个进程中的更改识别?

附:我的第一个问题是否与我正在向进程传递一个对象方法以作为其目标运行的事实有关?即对象函数调用,例如 test.myfunc = MyTest.myfunc(test)。

输出:

<__main__.MyTest object at 0x7f007bdf76d8>
<__main__.MyTest object at 0x7f007bdf76d8>
<__main__.MyTest object at 0x7f007bdf76d8>
in proc2
1

【问题讨论】:

  • 我认为答案可能在这里:stackoverflow.com/questions/20955683/… 和这里:stackoverflow.com/a/33701697/289011 (特别是说地址指针是虚拟的部分,因此它们代表进程地址空间内的偏移量本身 )
  • 那么一定是巧合,主进程和子进程在各自对应的虚拟地址空间中,原始对象(主进程)和复制对象(子进程)的偏移量相同?
  • 一定是这样...我不得不说,这也让我感到困惑:-S 这是一个很好的问题(至少它帮助我学到了一些我认为它会以不同的方式工作)

标签: python python-3.5


【解决方案1】:

我认为您应该使用pathos,它通过类简化了多处理,并且工作起来轻而易举。

第 1 步:

pip install pathos

第 2 步:

重构您的代码,使其能够在没有__init__() 的情况下运行, 然后有一个运行你想要运行的类方法,实例变量应该在你想要运行的类方法中。

第 3 步:

然后随心所欲地运行它。

例子:

from pathos.multiprocessing import ProcessingPool as Pool 
p = Pool(4)
class MyClass:

  def add(self, x, y):
      return x+y

mc = MyClass()
x = [1,2,3,4,5]
y = [0,2,4,6,8]
result = p.amap(mc.add, x, y)
print result.get()

来源: https://stackoverflow.com/a/21345308/7372029

https://github.com/uqfoundation/pathos/tree/master/examples

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-27
    • 2022-10-08
    • 2013-03-29
    • 2015-03-08
    • 2014-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多