【问题标题】:Will self object be shared by Python's multiprocessing.Process?Python 的 multiprocessing.Process 会共享 self 对象吗?
【发布时间】:2016-12-01 16:44:37
【问题描述】:

我有一个初始化各种原始和复杂数据类型和对象的 init 方法。在 multiprocessing.Process 生成的每个进程中,我打印了 init() 方法中的一个变量和一个初始化对象的地址。 我得到了变量的不同实例,但对象的地址保持不变。那么,想知道在 multiprocessing.Process 调用期间父类成员究竟发生了什么?

def __init__(self):
    self.count = 0
    self.db = pymongo.MongoClient()

def consumerManager(self):
    for i in range(4):
        p = multiprocessing.Process(target = self.consumer, args = (i,))


def consumer(self, i):
    while(1):
        time.sleep(i)
        self.count += 1
        print self.count
        print os.getpid()
        print id(self.db)

如果它正在对对象进行深度复制,那么id(self.db) 应该在每个进程中打印不同的 id,这不会发生。这是怎么做到的?

【问题讨论】:

  • 这是为 linux 设计的
  • 我在 init() 中初始化了一个 dict {'a':'b'} ,然后在每个进程中修改了 dict 后打印了 id,但所有进程仍然具有相同的 id 值他们持有特定于该流程的数据
  • 你试过用Pool代替吗?
  • 不,但两者的行为应该相同,对吧?

标签: python linux multiprocessing


【解决方案1】:

通常在 Linux 上,当创建一个新进程时,会生成一个父进程的副本。

一开始,两个进程将处于相同的状态,但地址空间不同。

为了节省时间,Linux 与子进程共享父进程的内存,直到双方都不修改它。这通常称为Copy On Write

随着两个进程不断执行,它们的状态会发生分歧。如果您希望他们共享信息,您可以使用不同的机制:PipesShared memoryManagersQueues

通常,由于它们的简单性,管道和队列是推荐的。

下面的question 解释了您看到相同 id 的原因。由于新进程具有与父进程相同的内存布局,因此在 CPython 中 id 将是相同的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-15
    • 2021-07-03
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    • 2021-08-11
    • 1970-01-01
    相关资源
    最近更新 更多