프로그래밍 연습하기

파이썬 PriorityQueue(우선순위 큐) 본문

Python

파이썬 PriorityQueue(우선순위 큐)

john.k 2020. 9. 8. 16:14
반응형

docs.python.org/3/library/queue.html

 

queue — A synchronized queue class — Python 3.8.5 documentation

queue — A synchronized queue class Source code: Lib/queue.py The queue module implements multi-producer, multi-consumer queues. It is especially useful in threaded programming when information must be exchanged safely between multiple threads. The Queue

docs.python.org

 

파이썬 PriorityQueue(우선순위 큐)를 사용해보면서 알게된 것을 정리해보려고 합니다.

 

우선순위 큐를 구성하고 나서,

내용을 확인하고 싶을 때가 있습니다.

그래서 이런식으로 확인 해봅니다.

>>> p_q = queue.PriorityQueue()
>>> p_q
<queue.PriorityQueue object at 0x03A2B8B0>
>>> print(p_q)
<queue.PriorityQueue object at 0x03A2B8B0>
>>> list(p_q)
Traceback (most recent call last):
  File "<pyshell#26>", line 1, in <module>
    list(p_q)
TypeError: 'PriorityQueue' object is not iterable

하지만 메모리 주소값이 나오고 iterable 하지 않아서 list로 만들어 볼 수도 없습니다.

이때 인스턴스 변수 queue를 사용해서 내부를 확인할 수 있습니다.

>>> p_q = queue.PriorityQueue()
>>> p_q.put(1)
>>> p_q.put(2)
>>> p_q.put(3)
>>> p_q.queue
[1, 2, 3]

이 queue는 내부적으로 heapq 모듈을 사용하여 구현한 것이기 때문에

자세하게 알고 싶으시다면 heapq 모듈 관련한 문서를 찾아보시면 도움이 될 것 같습니다.

 

그리고 비어있는 PriorityQueue에 get()을 했을 때, 계속 대기하게 됩니다.

대기하지 않으려면 get_nowait()을 사용해야 합니다.

아니면 get()을 사용하기 전에 비어있는지 검사를 하여 

비어있지 않을 때만 get()을 사용할 수도 있을 것 같습니다.

 

PriorityQueue는 비어있을 때도 True이기 때문에

비어있는 것을 확인하기 위해서는

 if queue: #비어 있어도 True
 if queue.empty(): #비어 있을 때만 True

이렇게 empty()를 통해 확인해주어야 합니다.

 

PriorityQueue 뿐만 아니고 queue 라이브러리에도 해당되는 내용들입니다.

우선순위 큐는 우선순위를 구현하기 위해 heapq를 사용했지만

기본 Queue는 deque를 사용하는 등의 차이점이 있습니다.

 

github.com/python/cpython/blob/3.9/Lib/queue.py

 

python/cpython

The Python programming language. Contribute to python/cpython development by creating an account on GitHub.

github.com

여기에서 직접 구현을 확인해보실 수도 있습니다.

반응형
Comments