Python:如何在多处理池中使用值和数组

标签 python arrays multiprocessing pool

对于使用Processmultiprocessing,我可以通过设置args 参数来使用Value, Array

multiprocessingPool,我如何使用 Value, Array。 文档中没有关于如何执行此操作的任何内容。

from multiprocessing import Process, Value, Array

def f(n, a):
    n.value = 3.1415927
    for i in range(len(a)):
        a[i] = -a[i]

if __name__ == '__main__':
    num = Value('d', 0.0)
    arr = Array('i', range(10))

    p = Process(target=f, args=(num, arr))
    p.start()
    p.join()

    print(num.value)
    print(arr[:])

我正在尝试在下面的代码片段中使用 Value, Array

import multiprocessing


def do_calc(data):
    #  access num or 
    #  work to update arr
    newdata =data * 2
    return newdata

def start_process():
    print 'Starting', multiprocessing.current_process().name

if __name__ == '__main__':
    num             = Value('d', 0.0)
    arr             = Array('i', range(10))  
    inputs          = list(range(10))
    print 'Input   :', inputs

    pool_size       = multiprocessing.cpu_count() * 2
    pool            = multiprocessing.Pool(processes=pool_size,initializer=start_process, )
    pool_outputs    = pool.map(do_calc, inputs)
    pool.close() # no more tasks
    pool.join()  # wrap up current tasks

    print 'Pool    :', pool_outputs

最佳答案

我从来不知道这样做的“原因”,但是 multiprocessing (mp) 对传递给大多数 Pool 的函数使用不同的 pickler/unpickler 机制> 方法。因此,由 mp.Valuemp.Arraymp.Lock 等创建的对象,...作为参数传递给此类方法,尽管它们可以作为参数传递给 mp.Process 给可选的初始化器 mp.Pool() 的函数。由于后者,这有效:

import multiprocessing as mp

def init(aa, vv):
    global a, v
    a = aa
    v = vv

def worker(i):
    a[i] = v.value * i

if __name__ == "__main__":
    N = 10
    a = mp.Array('i', [0]*N)
    v = mp.Value('i', 3)
    p = mp.Pool(initializer=init, initargs=(a, v))
    p.map(worker, range(N))
    print(a[:])

然后打印

[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]

这是我所知道的使它跨平台工作的唯一方法。

在 Linux-y 平台上(mp 通过 fork() 创建新进程),您可以改为创建您的 mp.Arraymp.Value(等)对象作为模块全局变量之前你做mp.Pool()fork() 创建的进程在 mp.Pool() 执行时继承模块全局地址空间中的任何内容。

但这在不支持 fork() 的平台(阅读“Windows”)上根本不起作用。

关于Python:如何在多处理池中使用值和数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39322677/

相关文章:

python - 将 sympy lambda 传递给 multiprocessing.Pool.map

python - 如何在使用线程/多处理时使用简单的 sqlalchemy 调用

python - Python 中的多处理执行并行写入

python - 将 boto3 输出转换为方便的格式

python - 我如何要求用户输入带有大写字母的密码 python

python - 如何粗化二维数组数据分辨率

java - 将数组存储到 ArrayList 而不分配另一个数组?

python - 如何使用 Poppler 以真实比例显示 PDF?

python - for 循环如果变量存在 - 如何使其变得Pythonic?

c++ - 函数错误中的数组字符串