每当我尝试使用共享内存与Python的“多处理”模块并行填充一个巨大的数组时,我会使用这样的方法:
import numpy as np
from multiprocessing import Process, RawArray
def tf(x, arr):
arr = np.reshape( np.frombuffer( arr, dtype=np.float32 ), -1 ).reshape((10, 10, 10))
arr[x] = np.random.random((10, 10))
mpa = RawArray('f', 1000)
ncpu = 4
procs = []
for i in range(10):
procs.append(Process(target=tf, args=(i, mpa)))
procs[-1].start()
if len(procs) == ncpu:
procs[0].join()
procs.pop(0)
for p in procs:
p.join()
arr = np.reshape( np.frombuffer( mpa, dtype=np.uint32 ), -1).reshape((10, 10, 10))
以确保只有与CPU数量相同的进程处于活动状态。如果我尝试使用'Pool'和'apply_blog',数组不会因为某种原因而改变。所以我想知道是否可以使用“池”或任何其他预期的方式来管理活动进程的数量。
上面的代码是工作,但不是最有效的,因为我只有当我第一次添加的进程完成,以决定我是否应该添加另一个进程。
1条答案
按热度按时间sz81bmfz1#
由于这个问题还没有得到回答,我将分享一个简单的
Pool
替代我设计的这类问题。