2012-06-07 2 views
0

많은 프로그램을 사용하고 있습니다. 따라서 더 빨리 만들고 다중 처리를 시도하고 싶습니다. 내가 프로그램이 저해상도를 사용하게 만들 때 일종의 일을 잘 해냈다. (나는 파워 스펙트럼을하고 있는데, 저해상도는 빠른 것이지만 매우 정확하지는 않다는 것을 의미한다.) 나는 ~ 2x 속도를 가지지 만, 고해상도를 할 때 단일 프로세서보다 더 오랜 시간 동안 runned가 끝나기 전에 종료했습니다.파이썬의 다중 처리. 프로그램이 join()을 마칩니다.

내 주요 파일

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 

그리고이

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]) 

처럼 내 ast_power 모습 내가 바로 그 일을되어 같은 것을 (나는 f_min,f_max,df,t,f을 정의)입니까? 나는 그것이 높은 df (저해상도) 및 저해상도가 아닌 매우 이상하다고 생각합니다. df (고해상도)

매우 도움이됩니다.

+0

파이썬과 멀티 프로세싱으로 GIL 문제를 찾았습니까? –

답변

1

join() 호출은 프로세스가 완료 될 때까지 프로세스를 차단합니다. 다음 프로세스를 실행하기 전에 각 프로세스가 완료되기를 기다리는 경우 멀티 프로세싱의 이점을 잃게됩니다! 프로세스를 독립적으로 실행하려면 start()를 사용하십시오.

+0

주 파일'i for mint : i.start()'에서 수행 한 작업이 아닌가요? 그렇지 않다면 어떻게 할 수 있습니까? (나쁜 강조 표시로 인해 유감스럽게 생각합니다.) –

+0

좋아, i.start()를 놓쳤다. 하지만 당신은 여전히 ​​i.join()이 필요 없습니다. "민트에서 i : i.join()"을 가져 가면 좋을 것입니다. – nathancahill

+0

좋아, 내 코드가 완벽 해. 하지만 이제는 "속도 향상"이 0.3이므로 다중 처리 속도가 느립니다. –