2017-10-29 1 views
0

입력 대기열에서 데이터를 읽은 스레드가 스레드와 함께 처리 한 다음 결과를 출력 대기열에 넣어 나중에 사용합니다. 그러나 스레드는 출력 대기열에 한 번만 쓸 수 있습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? 다음은 매우 단순화 된 자체 코드로 작성된 코드입니다.파이썬 스레드가 출력 대기열에 쓰기를 중지합니다.

input: 0 
result: 0 
input: 2 
input: 3 
input: 4 
... 
input: 999 

은 "결과"회만 인쇄되지만 I는 각 입력에 대해 한 번씩 여러 번 인쇄 예상 :

import queue 
import threading 


def do_work(input_queue,output_queue): 
    input_number = input_queue.get() 
    output_number = input_number ** 2 
    input_queue.task_done() 
    output_queue.put(output_number) 

input_queue = queue.LifoQueue() 
output_queue = queue.LifoQueue() 

t = threading.Thread(name="Some thread", target=do_work, args=(input_queue,output_queue)) 
t.start() 
for i in range(1000): 
    input_queue.put(i) 
    if output_queue.empty(): 
     print('input: {0}'.format(i)) 
    else: 
     result = output_queue.get() 
     print('result: {0}'.format(result)) 
     output_queue.task_done() 

이것은 다음 출력을 초래한다.

+0

어떤 종류의 루프에서'do_work()'에 코드를 래핑해야합니다. 그렇지 않으면 한 번 실행 한 다음 반환하면 스레드가 종료됩니다. –

답변

2

스레드에서 start을 호출하면 전달 된 함수가 실행되기 시작합니다. 이 경우 입력 큐에 하나 이상의 요소가있을 때까지 스레드를 차단하는 큐의 get 메서드를 호출합니다. 입력 큐가 하나의 요소를 갖자 마자 함수는 실행을 계속하고 첫 번째 입력을 출력 큐에 놓습니다. 그러나이 작업이 한 번 수행되면 함수가 반환되고 스레드가 종료됩니다.

스레드가 반복적으로 입력 대기열에 입력을 쿼리하게하려면 잠시 시간을내어 처음에 함수를 래핑해야합니다. 하나의 요소를 처리하고 상기 출력 큐에 넣어 조회 후이 경우

while True: 
    input_number = input_queue.get() 
    output_number = input_number ** 2 
    input_queue.task_done() 
    output_queue.put(output_number) 

들어, 담당자 스레드가 입력 큐에 나타나는 새로운 입력 요소를 기다릴 것이다. 요소가 있으면 동일한 처리 단계를 다시 수행합니다.

관련 문제