python - [ multiprocessing ] 中每个进程的数组需要一个列表,其中所有子列表合并

标签 python arrays parallel-processing multiprocessing

我正在编写一个程序,其中有多个进程并行工作。

对于每个进程,我想收集一些信息,然后在程序结束时,我希望将该信息写入二进制文件。

我一切工作正常(并行的东西和书面文件的东西),但是我收集的信息有问题......

我试图将信息保存在 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/

相关文章:

python - 如何使用 python 2.3 rsh ssh

python - 方镁石。插入后如何获取自动增量主键的值,除了last_insert_rowid()?

java - 在java中使用字符串数组时,将其转换为小写

python - 在 numpy 数组中找到仅符号不同的行对

python - 使用 pyparsing 分析时如何使两个语法等效部分的第一部分可选

python - 为什么当我切换随机变量 Z(X, Y) 的 X 和 Y 时,线性回归是错误的?

javascript - 如何获取数组中的 firestore 集合响应?

c# - 并行扩展

Python 多处理 : why are large chunksizes slower?

r - 在 Linux 中使用 mclapply 时 R 中出现奇怪的段错误