[파이썬] Python 큐(Queue) , 우선순위 큐(PriorityQueue) 사용법에 대해 알아봅시다.
큐(queue)는 선입선출 FIFO(First In First Out) 기반의 자료 구조입니다.
전산 전공이라면 무조건 배우고 가는 자료구조입니다.
파이썬에서는 queue모듈에서 큐(Queue), 스택(LifoQueue), 우선순위큐(PriorityQueue), SimpleQueue를 제공하고 있습니다.
파이썬에서 큐(queue)는 주로 멀티 쓰레딩(threading) 환경에서 사용된다고 알려져 있습니다.
큐 모듈에 정의된 클래스 정보는 다음과 같습니다.
클래스 생성시 인자로 처리되는 maxSize는 객체를 생성시 최대로 등록 가능한 아이템 개수를 의미합니다.
클래스 | 내용 |
queue.Queue(maxSize) | 선입선출(FIFO First-In, First-Out) |
queue.LifoQueue(maxsize) | 스택(Stack)과 동일하게 후입선출(LIFO Last-In, First-Out) |
queue.PriorityQueue(maxsize) | 데이터마다 우선순위를 주고, 우선순위가 높은 순으로 데이터를 출력. 튜플 자료형태로 등록(순위, 아이템) 우선순위는 숫자가 작을수록 높은 순위를 갖음 |
queue.SimpleQueue | 입력제한이 없는 FIFO 큐 |
위 클래스들은 다음 메서드들을 공통적으로 사용하게 됩니다.
메서드 | 내용 |
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)
다음 예제는 큐에 넣을 수 있는 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)
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.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
파이썬 큐 객체가 꽉 차 있는 경우에는 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
파이썬 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:\Users\ilike\AppData\Local\Programs\Python\Python39\python.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 : 하이
알아두면 유용한 자료구조 큐에 대해 알아보았습니다.