코드 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 요리 로봇은 세 대입니다.