在多处理中如何正确引用类的实例Pool.map?

2024-06-26 18:08:38 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我定义了以下类:

class Animal:
    def __init__(self):
        self.isAlive = True

以及以下功能:

^{pr2}$

现在,如果我创建一个动物列表,如下所示:

AnimalsList = [Animal() for i in range(0,5)]

如果函数应用于列表中动物类的任何实例,isAlive属性将更改为False。但是,如果我想将此函数应用于此列表并通过多处理库更改其内容,正确的方法是什么?在

我试过以下方法:

from multiprocessing import Process, Pool

pool = Pool()
pool.map(Kill_Animal, AnimalsList[0:3])

但是,如果我尝试检查列表中所有元素的属性,结果如下:

[print(animal.isAlive) for animal in AnimalsList]

输出:真真真真

另外,如果我尝试检查在运行时通过泳池。地图,它与对象自身的ID不匹配。我熟悉Python通过对象引用进行的调用,但是这里发生了什么?在


Tags: 对象方法函数inself列表for属性
1条回答
网友
1楼 · 发布于 2024-06-26 18:08:38

在研究了multiprocessing documentation之后,我理解了这个概念的误解。在

对于多处理,即使类的一个实例作为参数传递,ID与调用方法中的ID不同也是有意义的,因为现在我们在一个完全不同的进程中工作,因此此对象是原始对象的副本,并且不对应于相同的ID放在记忆里。因此,在副本中所做的任何更改都不会影响其原始实例。在

为了使用并行性和共享状态,必须应用不同的概念,多线程,如thread-based parallellism documentation中所述。多线程和多处理之间的区别已经在这里进行了详细的讨论:Multiprocessing vs Threading Python

回到原来的问题,有两种简单的方法可以循环使用列表并应用函数:

1。使用multiprocessing.dummy

multiprocessing.dummy replicates the API of multiprocessing but is no more than a wrapper around the threading module.

所以答案可以写成:

import multiprocessing.dummy as mp
p = mp.Pool(3) # With 3 being the number of threads.
p.map(Kill_Animal, AnimalsList)
p.close()
p.join()

[print(animal.isAlive) for animal in AnimalsList]

输出:False False False False False

2。使用Queue

^{pr2}$

输出:False False False False False

相关问题 更多 >