1,092
社区成员
发帖
与我相关
我的任务
分享
#设置输入数据data1,data2,方便以后大量不同的data2的数据做相同的运算;而data1的数据是固定的,在这个code中切成n份供n个进程并行:
class Data1+2():
def __init__(self,data1,data2):
from multiprocessing import cpu_count
self.ncpu=cpu_count()/2 #'/2' means double thresds, no '-1' caus only 2 cpu in this thinkpad
self.data1=data1
self.data2=data2
# 定义处理过程(就在这个过程中包含了并行计算):
def def0(self):
#将data1的数据切成n份供n个进程并行计算用:
for i in range(self.ncpu):
vars()['data1'+str(i)]={} #define dict 'data1i={}'
data1size = len(self.data1data)/self.ncpu +1
idata = 0
for key,xydata1 in self.data1.items():
if len(vars()['data1'+str(idata)]) < data1size-1:
vars()['data1'+str(idata)][key] = xydata1
elif len(vars()['data1'+str(idata)]) == data1size-1:
vars()['data1'+str(idata)][key] = xydata1
idata+=1
# 为了尽量减少重复运算,将公用的数据尽可能存到高阶数组中:
d0 = arange(600,800,2)
A0 = arange(10,80,2)
d,A = ix_(d0,A0)
num_d = d.size
num_a = A.size
MAx = reshape(A+ d - d,(num_d,num_a,1,1) )
MAy = reshape(A + d,(num_a,num_d,1,1) )
from multiprocessing import Process,Queue
#定义每个进程中的函数:
def run_process(que,xydata1,xydata2,MAx,MAy):
match = {} #定义一个字典(放结果)
#......计算过程不赘述......得到结果:
match[key, Mwhere, Gwhere] = mind
#return 当前进程下产生的结果:
que.put(match)
que = Queue()
#start 每一个进程:
for idata in range(self.ncpu):
pro = Process(target=run_process, args=(que,self.gaiadata,vars()['data'+str(idata)],MAx,MAy))
pro.start()
pro.join()
#合并每一个进程的结果:
match={}
for idata in range(self.ncpu):
match=dict(match, **que.get(True))
#return 所有结果:
return match