Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用共享内存的多处理_Python_Arrays_Multiprocessing_Shared Memory - Fatal编程技术网

Python 使用共享内存的多处理

Python 使用共享内存的多处理,python,arrays,multiprocessing,shared-memory,Python,Arrays,Multiprocessing,Shared Memory,有人能给我提供一些示例代码,让我在工作进程池中共享一个可写数组或列表,甚至使用python的多处理模块使用锁单独生成进程?下面的代码生成了两个进程,其中一个进程应将“1”打印到共享数组,另一个进程应将“2”打印到共享数组。但是,当我在处理后尝试打印出数组的元素时,它只会给我一个0的列表。我哪里做错了?我希望在多个进程之间共享一个可写的数据结构 下面是我的代码: import multiprocessing arr=multiprocessing.Array('i',10,lock=True)

有人能给我提供一些示例代码,让我在工作进程池中共享一个可写数组或列表,甚至使用python的多处理模块使用锁单独生成进程?下面的代码生成了两个进程,其中一个进程应将“1”打印到共享数组,另一个进程应将“2”打印到共享数组。但是,当我在处理后尝试打印出数组的元素时,它只会给我一个0的列表。我哪里做错了?我希望在多个进程之间共享一个可写的数据结构

下面是我的代码:

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])