我正在编写一个程序,其中有多个进程并行工作。
对于每个进程,我想收集一些信息,然后在程序结束时,我希望将该信息写入二进制文件。
我一切工作正常(并行的东西和书面文件的东西),但是我收集的信息有问题......
我试图将信息保存在 multiprocessing.Array
中,但问题是,似乎每个进程都在创建自己的数组。
当进程完成它们需要做的事情时,我打印了数组,以便我可以看到发生了什么,并且打印了:
['6554,a,0.109375,2;', '6554,c,0.099609375,2;']
['6557,g,0.109375,2;']
['6555,b,0.099609375,2;', '6555,f,0.109375,2;']
['6556,d,0.109375,2;']
[]
注意:字符串是我从进程中收集的信息。
有什么问题吗?
我的代码很长,所以我正在尽力解释自己。
------------------------ 更新-------------------- --------
我正在做的项目接收一个或多个文件,并将该文件压缩为 zip 文件。当有多个文件时,有多个进程,每个进程在压缩时都会从正在压缩的文件中收集信息并将其保存到 multiprocessing.Array
中。
最后,我调用另一个函数来写入包含该数组中的信息的二进制文件。
我期待一个像这样的数组(list
):
['6554,a,0.109375,2;', '6554,c,0.099609375,2;', '6557,g,0.109375,2;', '6555,b,0.099609375,2;', '6555,f,0.109375,2;', '6556,d,0.109375,2;']
最佳答案
您必须考虑到,当您创建一个新进程时,该子进程将获得自己的、新的和不同的地址空间。 At space 表示存储所有变量等的空间。
Process 1 process 2-child process
result = [] result = []
|
|
|
↓
result = [x1,x2,x3] --> xi are the values that you want to overwrite.
您必须考虑到在这种情况下结果是一个全局变量(我没有关于您的代码的信息,但我希望您在共享数据和变量时能够理解要点)。请注意,子进程会将全局变量复制到另一个地址内存中。因此,现在我们有了单独的结果变量的副本,因此当您运行函数(在我的例子中为方形函数)时,它仅更新子进程中的副本。所以,这就是问题所在。但是,我该如何解决这个问题呢?通过共享内存。我知道你知道,但澄清这一点对我和你来说更好。
共享内存
Process 1 process 2-child process
| |
| |
| |
↓ ↓
result = [x1,x2,x3] --> xi are the values that
现在,我相信您已经知道了。但解决方案不仅仅是使用 multiprocessing.Array('i', 4) --> 你必须指定你的数据类型,在我的例子中是整数和大小,例如 4 您必须考虑到普通数组的功能不能与多处理数组的功能一致。 我建议您不要忘记 process.join。
import multiprocessing
def calc_square(numbers, result):
for idx, n in enumerate(numbers):
result[idx] = n*n
if __name__ == "__main__":
numbers = [2,3,5]
result = multiprocessing.Array('i',3)
p = multiprocessing.Process(target=calc_square, args=(numbers, result))
p.start()
p.join()
print(result)
祝你好运!
请注意,如果您使用队列,您只需在函数参数中添加 q(随机名称)并放入函数 q.put(n*n) 中 在主进程中添加 q = multiprocessing.Queue() 和 p = multiprocessing.Process(target=calc_square, args=(numbers, q))。如果你想播种发生的事情,只需添加 while q.empty() is not False: print(q.get())
关于python - [ multiprocessing ] 中每个进程的数组需要一个列表,其中所有子列表合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47735074/