2017-04-08 3 views
1

파이썬 다중 처리를 사용하여 문자열로 큐를 채운 다음 다시 인쇄하지만 문제가 있습니다. 누군가 제가 잘못하고있는 것을 지적 할 수 있습니까?파이썬 다중 처리 큐 get 및 put

import multiprocessing 

my_q = multiprocessing.Queue() 
my_list =[i for i in range(0,100)] 

def enqueue(q): 
    for data in my_list: 
     q.put(data) 

def get_it(q): 
    while not q.empty(): 
     item = q.get() 
     print(item) 


p1 = multiprocessing.Process(target=enqueue, args=(my_q,)) 
p2 = multiprocessing.Process(target=get_it, args=(my_q,)) 
p1.start() 
p2.start() 

p1.join() 
p2.join() 

이 프로그램은 아무 것도 인쇄하지 않고 실행됩니다.

답변

1

큐가 채워지기 전에 get_it이 실행되면 즉시 반환되어 아무 것도 출력하지 않습니다.

get_it이 호출되기 전에 대기열이 채워져 있어야합니다. 모든 항목의 대기열 때까지

예를 들어,라고 enqueue 때까지 기다립니다 :

... 

def get_it(q): 
    while True: 
     item = q.get() 
     if item is None: # loop until sentinel value (None) appear. 
      break 
     print(item) 


my_list.append(None) # sentinel value to denote end of input value 
p1 = multiprocessing.Process(target=enqueue, args=(my_q,)) 
p2 = multiprocessing.Process(target=get_it, args=(my_q,)) 
p1.start() 
p2.start() 
p1.join() 
p2.join() 

또는 대신 multiprocess.pool.Pool.map을 사용합니다 :

... 

p1 = multiprocessing.Process(target=enqueue, args=(my_q,)) 
p1.start() 
p1.join() 

p2 = multiprocessing.Process(target=get_it, args=(my_q,)) 
p2.start() 
p2.join() 

여부를 다음과 같은 get_it 수정이 너무 일찍 종료

import multiprocessing.pool 

def get_it(item): 
    print(item) 

pool = multiprocessing.pool.Pool() 
pool.map(get_it, range(100)) 
+0

아, 알았어요. 감사! – Nitro