Python的多处理。该程序没有完成join()

时间:2012-06-07 09:35:48

标签: python multiprocessing

我有一个使用很多的程序。因此,我希望更快,并尝试进行多处理。当我使程序使用低分辨率(我正在进行功率谱;低分辨率意味着它将快速完成但它不会非常准确)时,它的工作正常。我的速度提高了约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(高分辨率)

任何帮助都是非常准确的。

1 个答案:

答案 0 :(得分:1)

join()调用将阻止该进程,直到完成为止。如果在运行下一个进程之前等待每个进程完成,您将失去多处理的好处!使用start()让流程独立运行。