python - 多处理写入python数组的函数循环

标签 python arrays loops multiprocessing

我正在尝试为此循环实现多重处理。它无法修改数组,或者似乎没有正确排序作业(在最后一个函数完成之前返回数组)。

import multiprocessing
import numpy


def func(i, array):
    array[i] = i**2
    print(i**2)

def main(n):
    array = numpy.zeros(n)

    if __name__ == '__main__':
        jobs = []
        for i in range(0, n):
            p = multiprocessing.Process(target=func, args=(i, array))
            jobs.append(p)
            p.start()

    return array

print(main(10))

最佳答案

进程不共享内存,您的程序最初将创建一个全为零的数组,然后启动 10 个进程,这将在首次创建数组时调用 func 函数,而不是原始数组。

看起来你真正想要完成的是这样的:

from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Array


def modify_array(index, sharedarray):
    sharedarray[index] = index ** 2
    print([x for x in sharedarray])


def main(n):
    lock = Lock()
    array = Array('i', 10, lock=lock)
    if __name__ == '__main__':
        for i in range(0, n):
            p = Process(target=modify_array, args=(i, array))
            p.start()
            p.join()
    return list(array)

main(10)

输出:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 4, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 4, 9, 0, 0, 0, 0, 0, 0]
[0, 1, 4, 9, 16, 0, 0, 0, 0, 0]
[0, 1, 4, 9, 16, 25, 0, 0, 0, 0]
[0, 1, 4, 9, 16, 25, 36, 0, 0, 0]
[0, 1, 4, 9, 16, 25, 36, 49, 0, 0]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 0]
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

但问题是,使用多处理是错误的。与新线程相比,甚至只是保持单线程并利用事件循环来触发操作,产生额外进程的开销很大。

在单线程、单进程的 Python 中使用并发的示例如下所示:

import numpy as np
from asyncio import get_event_loop, wait, ensure_future


def modify_array(index, array):
    array[index] = index ** 2
    print([x for x in array])


async def task(loop, function, index, array):
    await loop.run_in_executor(None, function, index, array)


def main(n):
    loop = get_event_loop()
    jobs = list()
    array = np.zeros(10)
    for i in range(0, n):
        jobs.append(
            ensure_future(
                task(loop, modify_array, i, array)
            )
        )
    loop.run_until_complete(wait(jobs))
    loop.close()

main(10)

这是当今流行的模式,使用异步事件循环来并行完成任务。但是,由于您使用的是 Numpy 等库,我怀疑这种模式对您的值(value)。

关于python - 多处理写入python数组的函数循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41611868/

相关文章:

javascript - 通过 JavaScript 遍历/解析 JSON 对象

python - 在循环中拟合具有不同 Epoch 编号的神经网络,而无需每次都重新开始

python - 如何在 PySpark 中一天内累积超过 '1 hour' 个窗口

python - 使用 Sed 向 Chef .json 文件添加新角色

python - 从 XGBoost 模型中获取实际特征名称

c++ - 如何对包含通过索引相互关联的数据的多个数组进行排序

Python-函数对象创建

c++ - 使用函数打开文件,然后让其他函数使用该文件?

c# - 在 Array 类上使用 Linq 扩展

java - 如果输入 < 1,如何让程序声明错误并退出