gpt4 book ai didi

python - 进程池中进程之间共享的类属性和内存?

转载 作者:行者123 更新时间:2023-11-28 19:01:30 26 4
gpt4 key购买 nike

我有一个类 A,它在启动时会更改可变类属性 nums

当使用 maxtasksperchild 通过进程池启动类时= 1,我注意到 nums 有几个不同进程的值。这对我来说是一种不受欢迎的行为。

我的问题是:

  • 进程是否共享内存?
  • 我是不是没有正确理解 maxtasksperchild 和进程池的工作原理?

编辑:我猜测池会腌制它启动的先前进程(而不是原始进程),从而保存 nums 的值,这是正确的吗?如果是这样,我如何强制它使用原始过程?

这是一个示例代码:

from multiprocessing import Pool


class A:
nums = []

def __init__(self, num=None):
self.__class__.nums.append(num) # I use 'self.__class__' for the sake of explicitly
print(self.__class__.nums)
assert len(self.__class__.nums) < 2 # checking that they don't share memory


if __name__ == '__main__':
with Pool(maxtasksperchild=1) as pool:
pool.map(A, range(99)) # the assert is being raised

编辑 因为 k.wahome 的回答:使用实例属性不能回答我的问题我需要使用类属性因为在我的原始代码中(此处未显示)我每个进程有多个实例.我的问题专门针对多处理池的工作原理。


顺便说一句,做下面的工作

from multiprocessing import Process

if __name__ == '__main__':
prs = []
for i in range(99):
pr = Process(target=A, args=[i])
pr.start()
prs.append(pr)
[pr.join() for pr in prs]
# the assert was not raised

最佳答案

您的观察还有另一个原因。 nums 中的值不是来自其他进程,而是来自 same 进程,当它开始托管 A 的多个实例时。发生这种情况是因为您没有设置 chunksize 在您的 pool.map 调用中设置为 1。在您的情况下设置 maxtasksperchild=1 是不够的,因为一个任务仍然消耗整个可迭代 block 。

This method chops the iterable into a number of chunks which it submits to the process pool as separate tasks. The (approximate) size of these chunks can be specified by setting chunksize to a positive integer. docs about map

关于python - 进程池中进程之间共享的类属性和内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52025073/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com