我有一个使用很多的程序。因此,我希望更快,并尝试进行多处理。当我使程序使用低分辨率(我正在进行功率谱;低分辨率意味着它将快速完成但它不会非常准确)时,它的工作正常。我的速度提高了约2倍,但是当它达到高分辨率时,我在它完成之后终止它,之后它比单处理器运行了更长的时间。
我的主文件是这样的(我定义了f_min,f_max,df,t,f
)
import multiprocessing as mp
from ast_power import power_spectrum
tasks = mp.cpu_count()
bound = mp.Queue()
res = mp.Queue()
mint = [mp.Process(target=power_spectrum,args=(t,f,bound,res)) for i in range(tasks)]
DF = (f_max-f_min)/tasks
for i in mint:
i.start()
for i in range(1,tasks+1):
a = i*f_min
b = a+DF
c = df
d = 1
bound.put([a,b,c,d])
for i in mint:
i.join()
fr,p = [],[]
while tasks:
frp,pp = res.get()
frp,pp = list(frp),list(pp)
fr += frp
p += pp
tasks -= 1
我的ast_power
看起来像这样
import numpy as np
def power_spectrum(time, data, param, R='None' ):
if R == 'None': #Normal
f_min = param[0]
f_max = param[1]
df = param[2]
w = param[3]
else: # Multiprocessing
f_min,f_max,df,w = param.get()
freq = np.arange(f_min,f_max,df)
for i in xrange( len(freq) ):
# Do the power spectrum...
# will produce; power, alfa, beta
if R == 'None': #Normal
return freq,power,alfa,beta
else: #Multiprocessing
R.put([freq,power,alfa,beta])
我做得对吗?我觉得很奇怪它适用于高df
(低分辨率)而不适用于低df
(高分辨率)
任何帮助都是非常准确的。
答案 0 :(得分:1)
join()调用将阻止该进程,直到完成为止。如果在运行下一个进程之前等待每个进程完成,您将失去多处理的好处!使用start()让流程独立运行。