도움이 될지 궁금한 점이 있으십니까? 저는 파이썬에 익숙하지 않고 소수의 코드를 여러 개의 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()
'if calcPrime (num) == True' 비교 결과가 중복됩니다. 간단히'if calcPrime (num)'을 사용하십시오. 또한'True','False' 또는'None'을 비교할 때'is' 연산자 인'calcPrime (num) is True'를 사용해야합니다. 단순히 "사실"값을 알고 싶다면 "not"를 사용하여 "false"를 확인하고 객체 자체를 "true"로 확인하십시오. – Bakuriu