2014-02-26 134 views
0

我有这样的:python多处理,做进程共享一个公共变量?

#!/usr/bin/env python 

import multiprocessing 

class MultiprocessingTest(object): 

    def __init__(self): 
     self.cmd = '' 

    def for_process_A(self): 
     self.cmd = "AA" 
     print "%s executing and cmd is %s" % (multiprocessing.current_process().name, self.cmd) 


    def for_process_B(self): 
     self.cmd = "BB" 
     print "%s executing and cmd is %s" % (multiprocessing.current_process().name, self.cmd) 


if __name__ == '__main__': 

    obj = MultiprocessingTest() 

    process_A = multiprocessing.Process(target=obj.for_process_A, name='process_A') 
    process_B = multiprocessing.Process(target=obj.for_process_B, name='process_B') 

    process_A.start() 
    process_B.start() 


    process_A.join() 
    process_B.join() 

问:

执行两个进程共享变量cmd

这两个过程有一个单独的类MultiprocessingTest的定义和工作呢?

这两个进程中存在哪些数据的独立副本?

我想从理论角度理解这里实际发生了什么。你能评论一下吗?

测试运行O/P:

$ ./commonvar.py 

process_A executing and cmd is AA 

process_B executing and cmd is BB 
+0

现在,这是一个奇妙的测试来运行自己!它出现了什么?什么是结论? –

+0

@Puciek增加了测试运行结果。 – abc

+0

那么测试对你说什么?不太正确?你可能需要扩展它以真正测试你想要做什么,以及测试;) –

回答

0

多内其发生的变化应该不会传播回调用“线”(或任何其他多进程的)。如果你想要这种类似“共享内存”的行为,你需要使用multiprocessing.Manager进行研究。

+0

我想从理论角度理解这里实际发生的事情。你能评论一下吗? – abc

+1

@abc - 当然。实际上,在你点击'process.start()'的地方,多处理启动一个新的python进程。它基本上克隆你当前的进程状态,然后主要独立于当前进程执行。完成所要求的操作后,它将返回值并将它们发送回当前流程,无论您想要如何处理它们。 – mgilson

1

进程不共享数据。每个过程与以下资源单独的容器中,一般地讲:

  • 代码以执行
  • 堆栈
  • 处理器时间

进程通过管道与外部世界进行交互。

因此,要回答你的问题:

  • 进程不会分享cmd变量。
  • 流程将拥有分类代码的单独副本。
  • 所有程序数据都是独立的。

进一步说明:

在幕后,fork system call用于创建一个进程(假设你使用* nix中)。由于在switching the conext中涉及的开销,所以与线程相比进程更重。