2013-08-31 2 views
0

도움이 될지 궁금한 점이 있으십니까? 저는 파이썬에 익숙하지 않고 소수의 코드를 여러 개의 CPU 코어를 통해 병렬로 계산하는 간단한 코드를 만들려고 노력하고 있습니다 ... 절름발이라는 것을 알고 있지만 합리적인 코드 조각처럼 보입니다 파이썬 스레드 등Python - 다중 프로세스 코드가 결과를 대기열에 성공적으로 반환하지만 코드가 중지됩니다

스레드를 사용하여 코드를 성공적으로 관리했지만 프로세스를 조사 중입니다.

아래 코드는 결과를 수집하는 지점까지 정상적으로 실행됩니다. 나는 이클립스 & pdev 디버거를 사용하여 디버깅을 시도했는데 while 루프가 3 번의 반복 작업 후에 막대를 제거하는 것으로 보이는 While 루프를 발견했다. 그래서 코드는 결과를 출력하는 단계에 실제로 도달하지 않는다.

모든 아이디어/조언/도움을 주시면 감사하겠습니다. 즉, 그것은 것, get()

l=[] 
while True: 
    try: 
     l+=outputQueue.get() # Code seems to stick here after about 3-4 iterations 
    except: 
     break 

통화가 차단됩니다

많은 감사

크레이그 ------ 코드

from multiprocessing import Process, Queue 

# return true if number is prime, else false 
def calcPrime(number):  
    divisor=2 
    if number%2==0: 
     return False 

    numberIsPrime=True 
    while divisor*divisor <= number: 
     if number % divisor == 0: 
      numberIsPrime = False 
      break 
     divisor = divisor + 1 
    return numberIsPrime 

# generate list of primes 
def generatePrimes(minimum, maximum): 
    return [num for num in range(minimum,maximum) if calcPrime(num)==True] 

def workerThread(output, mn, mx): 
    primelist=generatePrimes(mn,mx) 
    output.put(primelist) 

def main(): 
    outputQueue=Queue() 

    t=[] 
    t.append(Process(target=workerThread, args=(outputQueue, 1,25000))) 
    t.append(Process(target=workerThread, args=(outputQueue, 25001, 50000))) 
    t.append(Process(target=workerThread, args=(outputQueue, 50001, 75000))) 
    t.append(Process(target=workerThread, args=(outputQueue, 75001, 100000))) 

    #start all threads 
    for idx in range(len(t)): 
     t[idx].daemon=True 
     t[idx].start() 

    #wait for all process threads to complete 
    for p in t: 
     p.join() 
    print("Processes finished") 

    # gather all results 
    l=[] 
    while True: 
     try: 
      l+=outputQueue.get() # Code seems to stick here after about 3-4 iterations 
     except: 
      break 

    #print out our lovely primes 
    for idx in range(len(l)): 
     print (str(l[idx]))  

# standard code   
if __name__ == '__main__': 
    main() 
+0

'if calcPrime (num) == True' 비교 결과가 중복됩니다. 간단히'if calcPrime (num)'을 사용하십시오. 또한'True','False' 또는'None'을 비교할 때'is' 연산자 인'calcPrime (num) is True'를 사용해야합니다. 단순히 "사실"값을 알고 싶다면 "not"를 사용하여 "false"를 확인하고 객체 자체를 "true"로 확인하십시오. – Bakuriu

답변

1

이 코드는 무한 루프입니다 당신이 뭔가를 보낼 때까지 기다려. 귀하의 경우, 프로세스가 끝날 때 결코 반환하지 않는 에 대한 다른 호출이 수행됩니다.

당신은 프로세스의 수를 알고 있기 때문에 단순히 get()의의 번호를 수행 할 수 있습니다 프로세스가 결과의 변수 번호를 눌러 경우

l = sum((outputQueue.get() for _ in range(t)), []) 

는, 당신은 때 센티넬 값을 보낼 수 있습니다 작업자가 완료합니다 (예 : None). 출력을 수집하는 프로세스는 수신 된 센티넬의 수를 계산할 수 있으며 결국 큐를 쿼리하지 않습니다.

관련 문제