더북(TheBook)

코드 15-1 producer_consumer.py

import threading
import queue
import time
q = queue.Queue() 
orders_done = False 

def order_service(): 
    global orders_done
    for i in range(1, 11):
        food_number = int(input(f"{i} 번째 주문 음식을 고르세요(1: 피자, 2~: 치킨) : "))
        prefix = str(i) + " 번째 음식 "
        message = prefix + '피자' if food_number == 1 else prefix + '치킨'
        q.put(message) 
        thread_name = threading.current_thread().name
        print(f'[{thread_name}] : {message} 주문 완료')
    q.join() 
    print('모든 주문 처리 완료')
    orders_done = True

def cooking_service(): 
    while True:
        try:
            message = q.get(timeout=5) 
            thread_name = threading.current_thread().name
            print(f'[{thread_name}] : {message} 요리 시작')
            time.sleep(10) 
            print(f'[{thread_name}] : {message} 요리 완성')
            q.task_done() 
        except queue.Empty:
            if orders_done: 
                break
            else:
                continue

services = []
services.append(threading.Thread(target=order_service, name="order_service")) 11
12
for i in range(1, 4):
    cooking_service_name = "cooking_service " + str(i)
    services.append(threading.Thread(target=cooking_service,
                    name=cooking_service_name))
for service in services:
    service.start()

메시지 큐 역할을 합니다.

모든 주문이 처리 완료되면 True

키오스크 역할입니다. 주문을 받습니다.

요청받은 주문을 큐에 넣습니다.

모든 주문이 처리 완료되길 기다립니다.

요리 로봇 역할입니다. 실제 요리를 합니다.

주문을 큐에서 가져옵니다.

10초 동안 요리를 합니다.

큐에 받아 온 요청을 처리했다고 알립니다.

모든 주문을 처리했다면 요리 로봇도 동작을 멈추고 전원을 끕니다. 하루 장사가 마무리되었으니까요.

11 키오스크는 한 대입니다.

12 요리 로봇은 세 대입니다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.