[Python:자료구조] 파이썬 큐(Queue) , 우선순위 큐(PriorityQueue) 사용방법 및 예제 총정리
큐(queue)는 선입선출 FIFO(First In First Out) 기반의 자료 구조로 매우 유명합니다. 파이썬에서는 queue모듈에서 큐(Queue), 스택(LifoQueue), 우선순위큐(PriorityQueue), SimpleQueue를 제공하고 있습니다. 파이썬에서 큐(queue)는 주로 멀티 쓰레딩(threading) 환경에서 사용된다고 알려져 있습니다. 멀티쓰레딩 환경에 대한 예제 코드는 아래 블로그 글을 참고하세요.
[Python] 파이썬 멀티프로세싱(multiprocessing) 구현 예제 : 멀티 쓰레드(multi-Thread)와 실행시간 차이 분석
queue모듈에 정의되어 있는 클래스에 대한 정보 입니다. 클래스 생성시 인자로 처리되는 maxSize는 객체를 생성시 최대등록 가능한 아이템 개수입니다.
클래스 | 내용 |
queue.Queue(maxSize) | 선입선출(FIFO First-In, First-Out) |
queue.LifoQueue(maxsize) | 스택(Stack)과 동일하게 후입선출(LIFO Last-In, First-Out) |
queue.PriorityQueue(maxsize) | 데이터마다 우선순위를 주고, 우선순위가 높은 순으로 데이터를 출력. 튜플 자료형태로 등록(순위, 아이템) 우선순위는 숫자가 작을수록 높은 순위를 갖음 |
queue.SimpleQueue |
입력제한이 없는 FIFO 큐 |
위의 4개의 클래스에서 아래 메서드들을 동일하게 사용합니다.
메서드 | 내용 |
qsize() | 큐 객체에 등록된 아이템의 개수를 반환 |
put(item[, block[, timeout]]) | 큐 객체에 아이템을 등록 |
put_nowait(item) |
블로킹(blocking)없이 큐 객체에 아이템을 등록 큐 객체가 꽉 차 있는 경우에는 queue.Full예외 발생 |
get([block[, timeout]]) | 아이템 1개를 반환 |
get_nowait() |
블로킹(blocking)없이 큐 객체에 들어있는 아이템을 반환 큐 객체에 아이템이 없는 경우에는 queue.Empty 예외 발생 |
데이터가 추가하려면 put(x) 메서드를 사용하고, 데이터를 삭제하려면 get() 메서드를 사용합니다.
큐에 등록된 아이템의 개수는 qsize()메서드를 사용하여 확인이 가능합니다.
큐에 데이터를 넣는 것을 Enqueue라고 부르며, 반대로 큐에서 데이터를 꺼내는 것을 Dequeue라고 부릅니다.
■입력제한이 없는 큐를 생성 (Queue)
import queue
base_queue = queue.Queue()
base_queue.put("Hello")
base_queue.put(3)
base_queue.put(30.5)
base_queue.put("안녕")
print(f'base_queue의 사이즈 : {base_queue.qsize()}')
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
#실행결과
base_queue의 사이즈 : 4
Dequeue : Hello
Dequeue : 3
Dequeue : 30.5
Dequeue : 안녕
■입력제한을 두는 큐를 생성 (Queue)
큐에 넣을 수 있는 Max값을 3으로 하였습니다. 큐에 데이터를 넣을 때 , put()사용해도 되지만 아래와 같이 제한을 둔 큐를 생성한 경우 put_nowait()를 사용해도 무방합니다. 큐가 꽉찬경우 빈자리가 생길때까지 기다리지않고 입력을 시도합니다. 큐가 꽉찬 경우 full 오류가 발생하게 됩니다. put()를 사용하는 경우 빈자리가 없을 경우 무기한 대기상태로 기다리게 됩니다. 무기한 대기상태에서 get()을 한번 호출 해주어야 빈자리가 생겼음으로 큐에 등록이 됩니다.
import queue
base_queue = queue.Queue(3)
base_queue.put_nowait("Hello")
base_queue.put(3)
base_queue.put_nowait(30.5)
if base_queue.full():
print(f'큐가 꽉찼는가? : {base_queue.full()}')
else:
base_queue.put_nowait("안녕")
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
■큐 객체가 꽉 차 있는 경우에는 queue.Full 예외 발생
import queue
base_queue = queue.Queue(3)
base_queue.put_nowait("Hello")
base_queue.put(3)
base_queue.put_nowait(30.5)
base_queue.put_nowait("안녕")
[실행결과] :in_put_nowait, in put raise Full, queue_Full
■큐 객체에 아이템이 없는 경우에는 queue.Empty 예외 발생
get_nowait()메서드를 사용하는 큐에 값이 없을때 Empty오류를 발생하게 됩니다. 반대로 , get()를 사용하는 경우 큐에 값이 없을때 무기한 대기상태가 됩니다.
import queue
base_queue = queue.Queue(3)
base_queue.put_nowait("Hello")
base_queue.put(3)
base_queue.put_nowait(30.5)
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get()}')
print(f'Dequeue : {base_queue.get_nowait()}')
[실행결과] :in get_nowait, in get raise Empty, _queue.Empty
■LifoQueue 예제
import queue
lifo_queue = queue.LifoQueue()
lifo_queue.put("Hello")
lifo_queue.put(3)
lifo_queue.put(30.5)
lifo_queue.put(7)
print(f'Dequeue : {lifo_queue.get()}')
print(f'Dequeue : {lifo_queue.get()}')
print(f'Dequeue : {lifo_queue.get()}')
print(f'Dequeue : {lifo_queue.get()}')
#실행결과
C:UsersilikeAppDataLocalProgramsPythonPython39python.exe C:/python/Workspace/main.py
Dequeue : 7
Dequeue : 30.5
Dequeue : 3
Dequeue : Hello
■PriorityQueue 예제
import queue
priority_queue = queue.PriorityQueue()
priority_queue.put((5, "Hello", "Python"))
priority_queue.put((3, 1111))
priority_queue.put((1, 30.5))
priority_queue.put((7, "하이"))
print(priority_queue)
print(f'Dequeue : {priority_queue.get()}')
print(f'Dequeue : {priority_queue.get()}')
print(f'Dequeue : {priority_queue.get()[2]}')
print(f'Dequeue : {priority_queue.get()[1]}')
#실행결과
<queue.PriorityQueue object at 0x0000023541C4DFD0>
Dequeue : (1, 30.5)
Dequeue : (3, 1111)
Dequeue : Python
Dequeue : 하이
Process finished with exit code 0
■SimpleQueue예제
import queue
priority_queue = queue.SimpleQueue()
priority_queue.put("Hello")
priority_queue.put(1)
priority_queue.put(5)
priority_queue.put("하이")
print(priority_queue)
print(f'Dequeue : {priority_queue.get()}')
print(f'Dequeue : {priority_queue.get()}')
print(f'Dequeue : {priority_queue.get()}')
print(f'Dequeue : {priority_queue.get()}')
#실행결과
<_queue.SimpleQueue object at 0x0000028215FBC450>
Dequeue : Hello
Dequeue : 1
Dequeue : 5
Dequeue : 하이
[REFERENCE]
docs.python.org/3/library/queue.html
[파이썬 더 알아보기]
[프로그래밍/Python] – [Python] 파이썬 멀티프로세싱(multiprocessing) 구현 예제 : 멀티 쓰레드(multi-Thread)와 실행시간 차이 분석
[프로그래밍/Python] – [Python] 파이썬 싱글 쓰레드(Single Thread)와 멀티 쓰레드(multi Thread) 사용 예제 및 개념 이해하기
[프로그래밍/Python] – [Python] 파이썬 소수점 반올림, 돈 표기 방법 : 천단위 콤마(쉼표) 찍기( 천단위 구분 기호 추가), 숫자 콤마 제거
[프로그래밍/Python] – [Python] 파이썬 기본(기초) 문법 : 예제 및 총정리