더북(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 요리 로봇은 세 대입니다.