我一直在沮丧地尝试在运行对象方法的多个实例时使用多重处理来共享变量。我可以得到与此版本一起使用的mp.Process,共享数组只是作为变量传入,但是我不知道如何使用多线程来运行比核心更多的作业(例如,将30个作业分配给4个核心)。
下面是我的代码,我猜有2个选项:
Q1:有没有一种方法可以限制多线程中使用的内核数量,并且可以异步地进行限制?因此,我将30个作业分配给4个线程,每个线程在完成当前作业后都会抓取一个新作业。
Q2:我可以使用Pool并将“ array_toShare”传递给主对象“ mp_object”或其方法吗?现在,当我运行下面的“池”代码时,不能在内部使用array_toShare。而且,如果我在实例化时将变量分配给对象-它只是复制它的副本,而我不希望这样做。
# initizlie object
mp_object = Object()
# initialize share variable
tot_length = (n*m)
array_toShare = mp.Array(ctypes.c_double, tot_length, lock=False)
# make arg list to be passed to object.run function
args_in = []
for k in range(len(idx_list_local)):
args_in.append([... ,... ])
# initialize pool
p = mp.Pool(processes = CONFIG.resources.n_processors)
# assign original data to shared variable
toShare_new[:] = original_data.reshape(tot_length)
# run multiple instances of the method of the object in parallel
p.map_async(mp_object.run, args_in).get(988895)
p.close()