Python 使用共享内存的多处理
有人能给我提供一些示例代码,让我在工作进程池中共享一个可写数组或列表,甚至使用python的多处理模块使用锁单独生成进程?下面的代码生成了两个进程,其中一个进程应将“1”打印到共享数组,另一个进程应将“2”打印到共享数组。但是,当我在处理后尝试打印出数组的元素时,它只会给我一个0的列表。我哪里做错了?我希望在多个进程之间共享一个可写的数据结构 下面是我的代码:Python 使用共享内存的多处理,python,arrays,multiprocessing,shared-memory,Python,Arrays,Multiprocessing,Shared Memory,有人能给我提供一些示例代码,让我在工作进程池中共享一个可写数组或列表,甚至使用python的多处理模块使用锁单独生成进程?下面的代码生成了两个进程,其中一个进程应将“1”打印到共享数组,另一个进程应将“2”打印到共享数组。但是,当我在处理后尝试打印出数组的元素时,它只会给我一个0的列表。我哪里做错了?我希望在多个进程之间共享一个可写的数据结构 下面是我的代码: import multiprocessing arr=multiprocessing.Array('i',10,lock=True)
import multiprocessing
arr=multiprocessing.Array('i',10,lock=True)
lock=multiprocessing.RLock()
def putitin(n):
for i in range(5):
lock.acquire()
arr.append(n)
lock.release()
return
p1=multiprocessing.Process(target=putitin,args=(1,))
p2=multiprocessing.Process(target=putitin,args=(2,))
p1.start()
p2.start()
p1.join()
p2.join()
for i in range(10):
print(arr[i])
我在您的代码中发现了一些问题。首先,将所有共享资源传递给子级并使用
如果uuuu name\uuuuu=='\uuuuuuu main\uuuu'
。其次,我认为多处理.Array
没有append()
方法(至少它在Python2和Python3上对我不起作用)。第三,因为您使用的是lock=True
,所以我认为您不需要额外的锁
如果需要将值附加到数组中,我将使用单独的计数器变量(请参阅下面的代码)
话虽如此,你的高层次目标是什么?你想用它实现什么?也许可以使用
多处理.Pool
?您的代码的一个潜在问题是,要在Windows上使用多处理
,您需要将主进程的代码放入中,如果uu name_u=='\uu main_u':
块。请参阅本节的“主模块的安全导入”小节
另一个主要问题是,您试图在进程之间共享一个全局变量。这将不起作用,因为每个进程都在自己的非共享内存空间中运行,所以每个子进程都有自己的arr
。(不过,只是模块级常量的变量是可以的)
最后,multiprocessing.Array
具有固定大小,并且没有代码在putitin()
函数中尝试使用的extend()
方法-因此,您似乎还需要一个可写且可调整大小的容器(该容器是有序的,可能通过整数索引访问)
在这种情况下,类似以下内容可能是合适的。在对对象进行更改之前,不需要显式锁定该对象,因为它是线程安全的共享对象
import multiprocessing
def putitin(lst, value):
for i in range(5):
lst.append(value)
if __name__ == '__main__':
manager = multiprocessing.Manager()
lst = manager.list()
p1 = multiprocessing.Process(target=putitin, args=(lst, 1))
p2 = multiprocessing.Process(target=putitin, args=(lst, 2))
p1.start()
p2.start()
p1.join()
p2.join()
for i in range(len(lst)):
print(lst[i])
输出:
1
1.
1.
1.
1.
2.
2.
2.
2.
2.
这只是一段简单的代码。我有一种方法,可以运行1000个蒙特卡罗模拟,但我不想连续执行这些模拟,而是希望它们通过5个进程(每个进程200个模拟)并行运行。我希望每个进程将结果写入一个公共数组(大小为1000)。由于锁是共享资源的最佳方式,所以我的问题是,当一个进程向数组写入时,如何在数组上获取锁?对于每个进程也是如此,我希望它在处理完结果后立即获得共享数组上的锁,而不是将数组划分为每个processVedant7的单独段:我不知道我是否理解。不管怎样,只要需要,您可以使用lock=arr.get_lock()
(或者更好的是,使用带有arr.get_lock()的块获得整个共享数组的锁:…
块。请参阅。同时注意,在这种情况下,它应该是RLock
。另外,如果我的答案中的代码解决了您的问题,请接受它。(请参阅)它并不能完全解决我的问题,因为我不想将数组分成为每个进程保留的小段。
import multiprocessing
def putitin(lst, value):
for i in range(5):
lst.append(value)
if __name__ == '__main__':
manager = multiprocessing.Manager()
lst = manager.list()
p1 = multiprocessing.Process(target=putitin, args=(lst, 1))
p2 = multiprocessing.Process(target=putitin, args=(lst, 2))
p1.start()
p2.start()
p1.join()
p2.join()
for i in range(len(lst)):
print(lst[i])