python多处理,进程共享一个公共变量?

时间:2014-02-26 04:13:19

标签: python multiprocessing

我有这个:

#!/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

2 个答案:

答案 0 :(得分:1)

进程不共享数据。每个流程都是一个单独的容器,其中包含以下资源:

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

流程通过管道与外界互动。

所以回答你的问题:

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

进一步说明:

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

答案 1 :(得分:0)

多处理内部发生的更改不应传播回调用“线程”(或任何其他多处理进程)。如果您想要那种“共享内存”行为,则需要考虑使用multiprocessing.Manager