在python多处理中更改对象属性

时间:2016-06-20 10:59:39

标签: python multiprocessing static-methods

考虑以下对象:

from multiprocessing import Process
l= [Item() for i in range(5)]
for i in l:
    Process(target=i.increase).start()

这反映了我目前的情况,S是一些库类,Item收集和组织数据和数据操作过程。现在我想并行工作,因为我使用了python多处理模块:

[i.c for i in l]
[0, 0, 0, 0, 0]

结果不符合我的预期:

main.cpp:13:15: warning: 'tart' may be used uninitialized in this function [-Wmaybe-uninitialized]
     while(szam!=tart){
           ~~~~^~~~~~

我哪里错了?

1 个答案:

答案 0 :(得分:1)

你期待你的mutator,类increase中的静态方法S(从类increase中的非静态item调用)来调整每个{{ 1}}字段 - 它确实如此。问题不在于静态方法,而在于i.c的内部设计。

multiprocessing包通过运行多个单独的Python实例来工作。在类Unix系统上,它使用multiprocessing,这使得这更容易;在类似Windows的系统上,它会生成自己的新副本。无论哪种方式,这都会强加Python文档中描述的所有略微奇怪的限制:v2v3。 (注意:下面的其余链接是Python2文档,因为那是我仍然打开的页面。对Python2和Python3的限制几乎相同。)

在这种特殊情况下,每个fork调用都会创建对象Process的副本,并将该副本发送到新进程。该过程会修改副本,这对原始副本没有影响。

要解决此问题,您可以将修改后的对象发回,例如通过Queue() or Pipe() instance,或将对象放入shared memory。回送技术更简单,更容易编程并自动完成大部分必要的同步(但请注意在使用Process实例的i之前确保收集所有结果,甚至是隐式)。