考虑以下对象:
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){
~~~~^~~~~~
我哪里错了?
答案 0 :(得分:1)
你期待你的mutator,类increase
中的静态方法S
(从类increase
中的非静态item
调用)来调整每个{{ 1}}字段 - 它确实如此。问题不在于静态方法,而在于i.c
的内部设计。
multiprocessing
包通过运行多个单独的Python实例来工作。在类Unix系统上,它使用multiprocessing
,这使得这更容易;在类似Windows的系统上,它会生成自己的新副本。无论哪种方式,这都会强加Python文档中描述的所有略微奇怪的限制:v2和v3。 (注意:下面的其余链接是Python2文档,因为那是我仍然打开的页面。对Python2和Python3的限制几乎相同。)
在这种特殊情况下,每个fork
调用都会创建对象Process
的副本,并将该副本发送到新进程。该过程会修改副本,这对原始副本没有影响。
要解决此问题,您可以将修改后的对象发回,例如通过Queue() or Pipe() instance,或将对象放入shared memory。回送技术更简单,更容易编程并自动完成大部分必要的同步(但请注意在使用Process实例的i
之前确保收集所有结果,甚至是隐式)。