지난 포스팅에이어
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 등이 있는데!! 직접 공부해보세요!!!!
감사합니다!!^^
'데이터&AI > 기타개발' 카테고리의 다른 글
[realtime GPT를 쓰기위한 사전학습] socket통신의 이해 (python에서의 TCP 통신!) (0) | 2024.10.24 |
---|---|
[realtime GPT를 쓰기위한 사전학습]pyaudio이해하기② (데이터를 소리로 전환!!!) (2) | 2024.10.23 |
[realtime GPT를 쓰기위한 사전학습] threading의 이해 (python의 멀티태스킹!) (1) | 2024.10.17 |
Python으로 주말 or 공휴일 체크하는 로직 만들기 (with 공공 API) (0) | 2024.10.14 |
[Deepvoice] 내 목소리를 학습, 파일을 생성해보자!! (클릭만하면됨) (2) | 2024.09.05 |
댓글