Python

[Python:자료구조] 파이썬 큐(Queue) , 우선순위 큐(PriorityQueue) 사용방법 및 예제 총정리

큐(queue)는 선입선출 FIFO(First In First Out) 기반의 자료 구조로 매우 유명합니다. 파이썬에서는 queue모듈에서 큐(Queue), 스택(LifoQueue), 우선순위큐(PriorityQueue), SimpleQueue를 제공하고 있습니다. 파이썬에서 큐(queue)는 주로 멀티 쓰레딩(threading) 환경에서 사용된다고 알려져 있습니다. 멀티쓰레딩 환경에 대한 예제 코드는 아래 블로그 글을 참고하세요.

 

[Python] 파이썬 멀티프로세싱(multiprocessing) 구현 예제 : 멀티 쓰레드(multi-Thread)와 실행시간 차이 분석

 

[Python] 파이썬 멀티프로세싱(multiprocessing) 구현 예제 : 멀티 쓰레드(multi-Thread)와 실행시간 차이 분

파이썬에서 다중 CPU에서 병렬 실행을 위해서는 다중 프로세스를 이용하는 multiprocessing 모듈을 사용해야 합니다. 멀티 쓰레드를 구현하여 실행한 결과 프로세스 처리시간은 동일하였습니다. 그

playground.naragara.com

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] 파이썬 랜덤 숫자 뽑기 난수 발생(random) 예제 총정리 : randint(), randrange(), uniform(), shuffle(), choice(), choices(), simple()

[프로그래밍/Python] – [Python] 파이썬 기본(기초) 문법 : 예제 및 총정리

 

Leave a Reply

error: Content is protected !!