Python의 Queue 클래스는 queue 모듈에서 제공되며, 멀티스레드 환경에서 데이터를 안전하게 저장하고 관리할 수 있도록 설계된 데이터 구조입니다.
이 클래스는 기본적으로 FIFO(First In, First Out) 방식의 큐를 사용하지만, LIFO(Last In, First Out) 방식이나 우선순위 큐도 제공하여 다양한 용도로 활용할 수 있습니다.
다음은 Queue 클래스의 주요 메서드와 그 사용법을 설명한 내용입니다.
1. put(item, block=True, timeout=None)
이 메서드는 큐에 데이터를 추가하는 기능을 합니다.
- item: 큐에 추가할 데이터입니다.
- block: 큐가 가득 찼을 때 대기할지 여부를 설정합니다. 기본값은 True입니다.
- timeout: 대기할 최대 시간을 설정합니다. 시간이 초과되면 queue.Full 예외가 발생합니다.
사용 예시:
queue.put(10) # 큐에 숫자 10을 추가
queue.put("Hello") # 큐에 문자열 "Hello"를 추가
2. get(block=True, timeout=None)
이 메서드는 큐에서 데이터를 꺼내는 기능을 합니다. 기본적으로 FIFO 방식으로 동작하여, 가장 먼저 들어온 데이터를 꺼냅니다.
- block: 큐가 비었을 때 대기할지 여부를 설정합니다. 기본값은 True입니다.
- timeout: 대기할 최대 시간을 설정합니다. 시간이 초과되면 queue.Empty 예외가 발생합니다.
사용 예시:
item = queue.get() # 큐에서 데이터를 꺼냄
print(item) # 꺼낸 데이터를 출력
3. task_done()
이 메서드는 get()으로 꺼낸 작업이 완료되었음을 큐에 알리는 기능을 합니다. 이 메서드는 작업의 추적 용도로 사용되며, join() 메서드와 함께 사용됩니다.
task_done()을 호출하지 않으면 join()이 무한 대기 상태에 빠질 수 있습니다.
사용 예시:
item = queue.get() # 작업 수행
queue.task_done() # 작업 완료 알림
4. join()
이 메서드는 큐에 있는 모든 작업이 완료될 때까지 대기하는 기능을 합니다. 큐의 모든 아이템이 처리되고, 해당 아이템에 대해 task_done()이 호출된 후에야 반환됩니다.
사용 예시:
queue.join() # 큐가 비워질 때까지 대기
5. qsize()
이 메서드는 큐에 남아 있는 아이템의 개수를 반환합니다. 하지만 멀티스레드 환경에서는 정확하지 않을 수 있으므로 참고용으로만 사용해야 합니다.
사용 예시:
print(queue.qsize()) # 큐에 남아 있는 아이템 개수 출력
6. empty()
이 메서드는 큐가 비어 있는지 확인하는 기능을 합니다. 큐가 비어 있으면 True를 반환하고, 아이템이 남아 있으면 False를 반환합니다.
사용 예시:
if queue.empty():
print("Queue is empty!")
7. full()
이 메서드는 큐가 가득 찼는지 확인하는 기능을 합니다. 큐가 가득 차 있으면 True를 반환하고, 여유 공간이 있으면 False를 반환합니다.
사용 예시:
if queue.full():
print("Queue is full!")
큐의 종류
Python queue 모듈은 세 가지 종류의 큐를 제공합니다.
- Queue: 기본 큐로, FIFO(First In, First Out) 방식으로 아이템을 관리합니다.
- LifoQueue: 스택처럼 동작하는 큐로, LIFO(Last In, First Out) 방식으로 아이템을 관리합니다.
사용 예시:
from queue import LifoQueue
stack = LifoQueue()
stack.put(1)
stack.put(2)
print(stack.get()) # 출력: 2 (마지막으로 넣은 데이터)
- PriorityQueue: 우선순위를 기준으로 아이템을 관리하는 큐로, (우선순위, 데이터) 형태로 아이템을 넣으면 우선순위가 낮은 것부터 꺼냅니다.
사용 예시:
from queue import PriorityQueue
pq = PriorityQueue()
pq.put((2, "low priority"))
pq.put((1, "high priority"))
print(pq.get()) # 출력: (1, "high priority")
정리
메서드설명put() | 큐에 데이터를 추가 |
get() | 큐에서 데이터를 꺼냄 |
task_done() | 작업 완료 알림 |
join() | 모든 작업 완료 대기 |
qsize() | 큐에 남은 아이템 개수 반환 |
empty() | 큐가 비었는지 확인 |
full() | 큐가 가득 찼는지 확인 |
이 메서드들을 활용하면 멀티스레드 환경에서도 안전하고 효율적으로 작업을 관리할 수 있습니다.