본문 바로가기
데이터&AI/기타개발

[realtime GPT를 쓰기위한 사전학습] queue 의 이해 (python. 줄을 서시오!! FIFO)

by 일등박사 2024. 10. 18.
728x90

지난 포스팅에이어

2024.10.15 - [데이터&AI/기타개발] - [realtime GPT를 쓰기위한 사전학습] threading의 이해 (python의 멀티태스킹!)

realtime GPT를 쓰기위한 사전학습, python의 queue에 대하여 알아보겠습니다!!

 


 

우선!! 개념도 필요없이 코드를 하나 보지요!!

import queue

my_queue = queue.Queue()

# 데이터 넣기
my_queue.put(1)
my_queue.put(2)
my_queue.put(3)

# 데이터 꺼내기
print(my_queue.get())  # 1
print(my_queue.get())  # 2
print(my_queue.get())  # 3

 

결과는!?

 

아주 깔끔합니다!! my_queue라는 곳에 1,2,3을 넣었고 1,2,3,을 다시 get 했지요!!

이해가 되시나요~~?

list처럼 queue라는 구조에 데이터가 들어가고 나오는 것입니다!!

 

이렇게 간단한 queue라는것에 여러 기능이 있는데요! 그 기능을 알아보곘습니다!

 

1. 큐가 비었을떄 일정시간 대기하고 안오면 에러처리하기!@!

 > que.get에 timeout 기능을 쓰면 됩니다!!

import queue

my_queue = queue.Queue()

try:
    # 비어있는 큐에서 데이터를 가져오면, 2초 동안 대기 후 예외 발생
    my_queue.get(timeout=2)
except queue.Empty:
    print("큐가 비어있습니다!")

 

2. 큐 크기를 제한하기

 > queue가 너무 큰것을 맞이하려면!? Queue(maxsize)로 크기를 설정하면 큐에 더 이상 추가할 수 없을 때 대기하거나 오류를 발생시킬 수 있습니다.

q = queue.Queue(maxsize=3)

q.put(1)
q.put(2)
q.put(3)

try:
    # 큐가 가득 차 있으면 2초 동안 대기 후 예외 발생
    q.put(4, timeout=2)
except queue.Full:
    print("큐가 가득 찼습니다!")

 

3. 우선순위 있는 큐 만들기

 > 모든게 똑같이 FIFO는 싫고!! 나만의 우선순위가 있다면!? queue.PriorityQueue() 를 사용해줍니다!!

import queue

pq = queue.PriorityQueue()

# 우선순위와 함께 데이터 삽입 (우선순위가 낮을수록 먼저 처리됨)
pq.put((1, "apple"))  # 우선순위 1
pq.put((3, "banana")) # 우선순위 3
pq.put((2, "cherry")) # 우선순위 2
pq.put((1, "apple2"))  # 우선순위 1
pq.put((2, "apple"))  # 우선순위 1

# 데이터 꺼내기
print(pq.get())
print(pq.get())  
print(pq.get())  
print(pq.get()) 
print(pq.get())

 

그럼!! 우선순위 내에 오름차순의 방식으로 GET하게 됩니다!

 

4. 실시간으로 큐 바라보기!! : get_nowait

 > 데이터가 쌓이면 바로 처리하고 싶을때? while 문과 엮여 실시간으로 큐를 처리하는 기능이 있습니다!!

# queue 데이터를 처리하는 함수 
def queue_realtime_process ():
    while True:
        try:
            # 큐에서 데이터를 즉시 꺼내어 처리
            item = q.get_nowait()
            print(f"queue processed: {item}")
        except queue.Empty:
            # 큐가 비어 있으면 대기
            print("Queue is empty, waiting for data...")
            time.sleep(0.5)  # 0.5초 대기 후 다시 시도

 

위와 같은 방식으로 어딘가세어 queue에 데이터가 들어간다면!!

0.5초마다 데이터를 처리해주게 됩니다!!

이 방식을 지난번의 thread와 결합한!

최종 코드를 볼까요!?

import queue
import threading
import time

# 큐 생성
send_queue = queue.Queue()

# 큐에서 데이터를 꺼내는 함수
def queue_realtime_process():
    while True:
        try:
            # 큐에서 데이터를 즉시 꺼내려고 시도
            data = send_queue.get_nowait()
            print(f"Consumer: {data} 데이터를 처리합니다.")
        except queue.Empty:
            print("Consumer: 큐가 비어 있습니다. 대기 중입니다...")
            time.sleep(1)  # 큐가 비어 있으면 잠시 대기

# 스레드 생성
process_thread = threading.Thread(target=queue_realtime_process)
# 스레드 시작
process_thread.start()

## main 잡 시작!!
send_queue.put('데이터 1')
send_queue.put('데이터 2')
send_queue.put('데이터 3')

 

그럼!! process_thread 가 뒤에서 작동하며!! send_queue내에 데이터가 있는지를 1초마다 바라봅니다!

그리고 main 잡에서 각각 데이터를넣으면!?

 

 

이렇게!! 데이터를 처리하게 됩니다~!!

 

4. FIFO는 싫어  반대로하고싶어!! : LIFO

 > LIFO(Last In, First Out) 방식은 큐에서 마지막에 추가된 데이터가 가장 먼저 처리되는 자료구조인데요!!

물론 가능합니다!!

lifo_queue = queue.LifoQueue()

 

위 코드 하나면 끝!!

import queue

# LIFO 큐 생성
lifo_queue = queue.LifoQueue()

# 데이터 삽입
lifo_queue.put(1)
lifo_queue.put(2)
lifo_queue.put(3)

# 데이터 처리 (마지막으로 들어간 3이 먼저 나옴)
print(lifo_queue.get())  # 3
print(lifo_queue.get())  # 2
print(lifo_queue.get())  # 1

 

결과를 볼까요!?

들어간 순서와 반대로 3,2,1이 나오죠!!

 

이 외에도 SimpleQueue. deque 등이 있는데!! 직접 공부해보세요!!!!

 

감사합니다!!^^

728x90

댓글