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() 큐가 가득 찼는지 확인

이 메서드들을 활용하면 멀티스레드 환경에서도 안전하고 효율적으로 작업을 관리할 수 있습니다.

+ Recent posts