使用异步共享numpy数组的python多处理:池与队列

使用异步共享numpy数组的python多处理:池与队列,python,numpy,multiprocessing,pool,Python,Numpy,Multiprocessing,Pool,我希望在规则网格上生成周期性的柏林噪声。我需要生成几个贴图,网格非常大,所以我想使用多处理,每个核心生成一个贴图 地图将绘制在图形上,并将一个接一个地放置在单个二进制dat文件上。 地图将存储在一个单一的numpy数组中,大小为地图的数量* 节点数,因此一个切片将是一个映射,因此我可以同时访问阵列的不同区域而无需担心 我把它作为引用,它使用一个池和,在这里我使用一个队列在多处理中进行一些绘图 我想出了两个代码:带队列的代码可以在我自己的电脑上正常工作,但不能在实验室的工作站或专业笔记本电脑上工作

我希望在规则网格上生成周期性的柏林噪声。我需要生成几个贴图,网格非常大,所以我想使用多处理,每个核心生成一个贴图

地图将绘制在图形上,并将一个接一个地放置在单个二进制dat文件上。 地图将存储在一个单一的numpy数组中,大小为地图的数量* 节点数,因此一个切片将是一个映射,因此我可以同时访问阵列的不同区域而无需担心

我把它作为引用,它使用一个池和,在这里我使用一个队列在多处理中进行一些绘图

我想出了两个代码:带队列的代码可以在我自己的电脑上正常工作,但不能在实验室的工作站或专业笔记本电脑上工作:我没有错误消息,只是在某个时刻冻结了。 第二个很好,我发现它比第一个例子简单,因为我只是直接在numpy数组中编写。(对于第一个链接的异步情况,我不太理解对所有函数和init的需要。)

我的问题是:为什么我的第一个代码有问题? 我只把我认为相关的代码放在下面

谢谢你的帮助

第一次尝试:

def生成辐射图(rad\u v):
而任务\u queue.empty()==False:
打印(“提取工作…”)
map_index=tasks_queue.get()#从队列中获取一些要做的工作
打印(“--->处理映射:%s”%map\u索引)
perm=范围(permsize)
随机。洗牌(烫发)
perm+=perm
对于范围内的i(nb_节点):
#调用柏林函数:fBm
rad_v[map_index,i]=fBm(perm,x[i]*freq,y[i]*freq,int(sizex*freq),int(sizey*freq),octs,持久性)
rad_v[map_index,:]=rad_v[map_index,:]+abs(最小值(rad_v[map_index,:]))
rad_v[map_index,:]=rad_v[map_index,:]/max(rad_v[map_index,:])
图=plt.图(图尺寸=(20,7))
plt.tricontourf(x,y,rad_v[map_index,:]))
plt.axis(“图像”)
plt.色条(收缩=0.5)
图.savefig('diff_gb_和_pf_irrad_c_map_'+str(map_index)+'.png'))
plt.clf()
plt.close()
tasks_queue.task_done()#此项目的工作已完成
开始时间=time.time()
nb_地图=10
nb_proc=1#进程数
打印(“生成%d个辐照贴图”%nb\u贴图)
irrad_c_base_数组=mp.array(ctypes.c_double,nb_映射*nb_节点)
irrad_c=np.frombuffer(irrad_c_base_数组.get_obj())
irrad_c=irrad_c.重塑(nb_贴图,nb_节点)
tasks_queue=mp.JoinableQueue()#将要做的工作堆积起来的队列
作业=列表(范围(nb#U映射))#每个作业由一个映射组成
打印(“在队列中插入作业…”)
工作中的工作:
任务\u队列.放置(作业)
打印(“完成”)
#启动流程
对于范围内的i(nb_过程):
当前进程=mp.process(目标=生成辐照图,args=(irrad\u c,)
当前_进程。开始()
#等待处理所有任务
任务\u队列.加入()
第二次尝试:

def生成映射(arg列表):
映射索引=参数列表[0]
打印('正在处理映射%i'%map\u索引)
perm=范围(permsize)
随机。洗牌(烫发)
perm+=perm
对于范围内的i(nb_节点):
参数列表[1][i]=fBm(perm,x[i]*freq,y[i]*freq,int(sizex*freq),int(sizey*freq),octs,持久性)
arg_list[1][:]=arg_list[1][:]+abs(最小值(arg_list[1][:]))
arg_list[1][:]=arg_list[1][:]/max(arg_list[1][:])
#密谋
图=plt.图(图尺寸=(20,7))
#plt.tricontourf(x,y,rad_v[map_index,:]))
plt.tricontourf(x,y,arg_列表[1][:])
plt.axis(“图像”)
plt.色条(收缩=0.5)
图.savefig('diff_gb_和_pf_irrad_c_map_'+str(map_index)+'.png'))
plt.clf()
plt.close()
开始时间=time.time()
nb_映射=2
nb_proc=2#进程数
打印(“生成%d个辐照贴图”%nb\u贴图)
irrad_c_base_array=mp.array(ctypes.c_double,nb_映射*nb_节点)#我们构建共享阵列,可从所有进程访问。我们不能进入相同的区域。
irrad_c=np.frombuffer(irrad_c_base_数组.get_obj())
irrad_c=irrad_c.重塑(nb_贴图,nb_节点)
args=[[i,irrad_c[i,:]]表示范围内的i(nb_映射)]
关闭(mp.Pool(processs=nb\u proc))作为作业池:
jobs\u pool.map\u async(生成\u映射,参数)
jobs_pool.join()