当前位置: 首页 > 面试题库 >

是否将共享的只读数据复制到不同的进程以进行多处理?

宰父疏珂
2023-03-14
问题内容

我拥有的这段代码看起来像这样:

glbl_array = # a 3 Gb array

def my_func( args, def_param = glbl_array):
    #do stuff on args and def_param

if __name__ == '__main__':
  pool = Pool(processes=4)
  pool.map(my_func, range(1000))

有没有一种方法可以确保(或鼓励)不同的进程不会获得glbl_array的副本而是共享它。如果没有办法停止复制,我将使用内存映射数组,但是我的访问模式不是很规则,因此我希望内存映射数组会更慢。以上似乎是要尝试的第一件事。这是在Linux上。我只是想从Stackoverflow获得一些建议,而又不想惹恼sysadmin。您认为第二个参数是真正的不可变对象(如)是否会有所帮助glbl_array.tostring()


问题答案:

您可以multiprocessing轻松地将共享内存与Numpy一起使用:

import multiprocessing
import ctypes
import numpy as np

shared_array_base = multiprocessing.Array(ctypes.c_double, 10*10)
shared_array = np.ctypeslib.as_array(shared_array_base.get_obj())
shared_array = shared_array.reshape(10, 10)

#-- edited 2015-05-01: the assert check below checks the wrong thing
#   with recent versions of Numpy/multiprocessing. That no copy is made
#   is indicated by the fact that the program prints the output shown below.
## No copy was made
##assert shared_array.base.base is shared_array_base.get_obj()

# Parallel processing
def my_func(i, def_param=shared_array):
    shared_array[i,:] = i

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=4)
    pool.map(my_func, range(10))

    print shared_array

哪个打印 ``

[[ 0.  0.  0.  0.  0.  0.  0.  0.  0.  0.]
 [ 1.  1.  1.  1.  1.  1.  1.  1.  1.  1.]
 [ 2.  2.  2.  2.  2.  2.  2.  2.  2.  2.]
 [ 3.  3.  3.  3.  3.  3.  3.  3.  3.  3.]
 [ 4.  4.  4.  4.  4.  4.  4.  4.  4.  4.]
 [ 5.  5.  5.  5.  5.  5.  5.  5.  5.  5.]
 [ 6.  6.  6.  6.  6.  6.  6.  6.  6.  6.]
 [ 7.  7.  7.  7.  7.  7.  7.  7.  7.  7.]
 [ 8.  8.  8.  8.  8.  8.  8.  8.  8.  8.]
 [ 9.  9.  9.  9.  9.  9.  9.  9.  9.  9.]]

但是,Linux在上具有写入时复制的语义fork(),因此,即使不使用multiprocessing.Array,也不会复制数据,除非将其写入。



 类似资料:
  • 我只能在线程之间使用它,但我想在进程之间共享。所以我的问题是,如何使用posix计数信号量来制作二进制信号量?

  • 问题内容: 通过回答此问题,可以回答所有其他三个问题。希望我能说清楚: 在通过多处理创建的某些过程中创建对象后: 如何将对该对象的 引用 传递给其他进程? (不是很重要)我如何确保持有参考书时此过程不会消失? 示例1(已解决) 例子2 假设返回一个具有可变状态的对象。这个相同的对象应该可以从其他进程访问。 例子3 我有一个带有打开文件和锁的对象-如何授予对其他进程的访问权限? 提醒 我不希望此特定

  • 问题内容: 在Python中,我看到了许多示例,其中调用了多处理,但目标仅打印了一些内容。我有一种情况,目标返回2个变量,以后需要使用。例如: 怎么办?我可以执行.start和.join,但是如何检索单个结果?我需要捕捉我执行的所有作业的返回a,b,然后对其进行处理。 问题答案: 是的,可以- 您可以使用多种方法。最简单的一种是共享。在此处查看示例:http : //eli.thegreenpla

  • 本文向大家介绍Android开发中多进程共享数据简析,包括了Android开发中多进程共享数据简析的使用技巧和注意事项,需要的朋友参考一下  背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用。我们会认为这不是So easy吗?只要把数据存到SharedPreferences中,然后让app打开同一个SharedPreferences读取数据就可以了

  • 问题内容: 我有以下问题。我编写了一个函数,该函数将列表作为输入并为列表中的每个元素创建一个字典。然后,我想将此字典追加到新列表中,以便获得字典列表。我正在尝试为此生成多个进程。我在这里的问题是,我希望不同的进程访问字典列表,因为它由其他进程更新,例如,一旦达到一定长度,就打印一些东西。 我的例子是这样的: 现在我的问题是每个过程都创建自己的过程。有没有一种方法可以在进程之间共享列表,以便所有字典

  • 本文向大家介绍C++进程间共享数据实例,包括了C++进程间共享数据实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了C++进程间共享数据的实现方法,分享给大家供大家参考。具体实现方法如下: 希望本文所述对大家的C++程序设计有所帮助。