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