Python 多处理池创建重复列表
Python multiprocessing pool creating duplicate lists
我正在尝试弄清楚多处理,但我 运行 遇到了我完全不明白的事情。
我正在使用 pathos.multiprocessing 进行更好的酸洗。下面的代码创建了一个我想要遍历的对象列表。但是,当我 运行 它时,它会打印几个不同的列表,尽管它引用了同一个变量?
import os
from pathos.multiprocessing import ProcessPool as Pool
class AnyClass:
def __init__(self):
pass
def any_function():
any_list = []
for i in range(0, 3):
any_object = AnyClass()
any_list.append(any_object)
def particular_function(_argument):
print(any_list)
with Pool(os.cpu_count()-1) as pool:
pool.map(particular_function, any_list)
print(any_list)
if __name__ == '__main__':
any_function()
输出看起来像这样,每次都有不同的列表。
[<__main__.AnyClass object at 0x7ff03da8ffd0>, <__main__.AnyClass object at 0x7ff03da9c040>, <__main__.AnyClass object at 0x7ff03da9c070>]
[<__main__.AnyClass object at 0x7ff03da9c100>, <__main__.AnyClass object at 0x7ff03da9c130>, <__main__.AnyClass object at 0x7ff03da9c160>]
[<__main__.AnyClass object at 0x7ff03da9c1f0>, <__main__.AnyClass object at 0x7ff03da9c220>, <__main__.AnyClass object at 0x7ff03da9c250>]
[<__main__.AnyClass object at 0x7ff03ac6a4f0>, <__main__.AnyClass object at 0x7ff03ac9ad60>, <__main__.AnyClass object at 0x7ff03da57af0>]
如果这是一个糟糕的解释或糟糕的问题,我很抱歉,因为我是 python 的新手,但是有什么办法可以解决这个问题吗?即每次都有相同的列表?
使用多处理时,库会生成多个不同的进程。每个进程都有自己的地址space。这意味着这些进程中的每一个都有自己的变量副本,并且一个进程中的任何更改都不会反映在其他进程中。
为了使用共享内存,您需要特殊的结构来定义您的全局变量。对于 pathos.multiprocessing
,从 this 评论来看,您似乎可以通过简单地导入以下内容来声明多处理类型共享变量:
from pathos.helpers import mp as multiprocess
a = multiprocess.Array('i', 2) # Declares an integer array of size 2
我正在尝试弄清楚多处理,但我 运行 遇到了我完全不明白的事情。
我正在使用 pathos.multiprocessing 进行更好的酸洗。下面的代码创建了一个我想要遍历的对象列表。但是,当我 运行 它时,它会打印几个不同的列表,尽管它引用了同一个变量?
import os
from pathos.multiprocessing import ProcessPool as Pool
class AnyClass:
def __init__(self):
pass
def any_function():
any_list = []
for i in range(0, 3):
any_object = AnyClass()
any_list.append(any_object)
def particular_function(_argument):
print(any_list)
with Pool(os.cpu_count()-1) as pool:
pool.map(particular_function, any_list)
print(any_list)
if __name__ == '__main__':
any_function()
输出看起来像这样,每次都有不同的列表。
[<__main__.AnyClass object at 0x7ff03da8ffd0>, <__main__.AnyClass object at 0x7ff03da9c040>, <__main__.AnyClass object at 0x7ff03da9c070>]
[<__main__.AnyClass object at 0x7ff03da9c100>, <__main__.AnyClass object at 0x7ff03da9c130>, <__main__.AnyClass object at 0x7ff03da9c160>]
[<__main__.AnyClass object at 0x7ff03da9c1f0>, <__main__.AnyClass object at 0x7ff03da9c220>, <__main__.AnyClass object at 0x7ff03da9c250>]
[<__main__.AnyClass object at 0x7ff03ac6a4f0>, <__main__.AnyClass object at 0x7ff03ac9ad60>, <__main__.AnyClass object at 0x7ff03da57af0>]
如果这是一个糟糕的解释或糟糕的问题,我很抱歉,因为我是 python 的新手,但是有什么办法可以解决这个问题吗?即每次都有相同的列表?
使用多处理时,库会生成多个不同的进程。每个进程都有自己的地址space。这意味着这些进程中的每一个都有自己的变量副本,并且一个进程中的任何更改都不会反映在其他进程中。
为了使用共享内存,您需要特殊的结构来定义您的全局变量。对于 pathos.multiprocessing
,从 this 评论来看,您似乎可以通过简单地导入以下内容来声明多处理类型共享变量:
from pathos.helpers import mp as multiprocess
a = multiprocess.Array('i', 2) # Declares an integer array of size 2