Computer >> 컴퓨터 >  >> 프로그램 작성 >> Python

큐 모듈을 사용하여 Python에서 스택 및 큐

<시간/>

Python에서 스택 및 큐 데이터 구조를 구현하는 것은 매우 쉽습니다. 스택은 "후입선출"의 원칙에 따라 작동하기 때문에 스택을 LIFO라고 하고 큐는 "선입 선출"의 원칙에 따라 작동하고 Python의 내장 함수는 코드는 더 짧고 간단합니다.

Queue 모듈은 다중 생산자, 다중 소비자 대기열을 구현하며 다중 스레드 간에 정보를 안전하게 교환해야 하는 경우 스레드 프로그래밍에서 특히 유용합니다. 이 모듈의 Queue 클래스는 필요한 모든 잠금 의미 체계를 구현하며 Python의 스레드 지원 가용성에 따라 다릅니다.

이 모듈은 항목이 검색되는 순서만 다른 세 가지 유형의 대기열을 구현합니다. FIFO 대기열의 경우 추가된 첫 번째 작업이 먼저 검색되고 LIFO 대기열의 경우 가장 최근에 추가된 항목이 가장 먼저 검색됩니다(스택처럼 작동). 그리고 우선순위 큐의 경우 항목이 정렬된 상태로 유지되고(heapq 모듈 사용) 가장 낮은 값의 항목이 먼저 검색됩니다.

이 대기열 모듈은 다음 클래스와 예외를 정의합니다.

클래스 Queue.Queue(최대 크기=0)

이것은 FIFO 대기열의 생성자입니다. 인수 maxsize는 대기열에 넣을 수 있는 항목 수의 상한을 설정하는 정수입니다. 이 크기에 도달하면 대기열 항목이 사용될 때까지 삽입이 차단됩니다. maxsize가 0보다 작거나 같으면 대기열 크기는 무한합니다.

클래스 Queue.LifoQueue(최대 크기=0)

이것은 LIFO 대기열의 생성자입니다. 인수 maxsize는 대기열에 넣을 수 있는 항목 수의 상한을 설정하는 정수입니다. 이 크기에 도달하면 대기열 항목이 사용될 때까지 삽입이 차단됩니다. maxsize가 0보다 작거나 같으면 대기열 크기는 무한합니다.

클래스 Queue.PriorityQueue(최대 크기=0)

이것은 우선순위 큐의 생성자입니다. 인수 maxsize는 대기열에 넣을 수 있는 항목 수의 상한을 설정하는 정수입니다. 이 크기에 도달하면 대기열 항목이 사용될 때까지 삽입이 차단됩니다. maxsize가 0보다 작거나 같으면 대기열 크기는 무한합니다.

예외 Queue.Empty

이 줄은 비어 있는 Queue 개체에서 비차단 get()(또는 get_nowait())이 호출될 때 발생하는 예외를 나타냅니다.

예외 Queue.Full

이 줄은 비차단 put()(또는 put_nowait())이 가득 찬 Queue 객체에서 호출될 때 발생하는 예외를 나타냅니다.

대기열 개체

Queue.qsize()

이 함수는 대략적인 큐 크기를 반환합니다.

Queue.empty()

이 함수는 대기열이 비어 있으면 True를 반환하고 그렇지 않으면 False를 반환합니다. empty()가 True를 반환하면 put()에 대한 후속 호출이 차단되지 않는다는 보장이 없습니다. 마찬가지로 empty()가 False를 반환하면 get()에 대한 후속 호출이 차단되지 않는다는 보장이 없습니다.

Queue.full()

대기열이 가득 차면 True를 반환하고 그렇지 않으면 False를 반환합니다. full()이 True를 반환하면 get()에 대한 후속 호출이 차단되지 않는다는 보장이 없습니다. 마찬가지로 full()이 False를 반환하면 put()에 대한 후속 호출이 차단되지 않는다는 보장이 없습니다.

Queue.put(item[, block[, timeout]])

항목을 대기열에 넣습니다. 선택적 args block이 true이고 timeout이 None(기본값)이면 여유 슬롯을 사용할 수 있을 때까지 필요한 경우 차단합니다. 시간 초과가 양수이면 최대 시간 초과 시간(초)을 차단하고 해당 시간 내에 사용 가능한 여유 슬롯이 없는 경우 전체 예외를 발생시킵니다. 그렇지 않으면(블록이 false임) 빈 슬롯이 즉시 사용 가능한 경우 항목을 대기열에 넣고, 그렇지 않으면 전체 예외를 발생시킵니다(이 경우 시간 초과는 무시됨).

Queue.get([block[, timeout]])

대기열에서 항목을 제거하고 반환합니다. 선택적 args block이 true이고 timeout이 None(기본값)이면 항목을 사용할 수 있을 때까지 필요한 경우 차단합니다. timeout이 양수이면 최대 timeout 초를 차단하고 해당 시간 내에 사용할 수 있는 항목이 없으면 Empty 예외를 발생시킵니다. 그렇지 않으면(블록이 false임) 즉시 사용할 수 있는 항목이 있으면 항목을 반환하고, 그렇지 않으면 Empty 예외를 발생시킵니다(이 경우 시간 초과는 무시됨).

Queue.task_done()

이전에 대기열에 넣은 작업이 완료되었음을 나타냅니다. 대기열 소비자 스레드에서 사용합니다. 작업을 가져오는 데 사용되는 각 get()에 대해 task_done()에 대한 후속 호출은 대기열에 작업 처리가 완료되었음을 알려줍니다.

join()이 현재 차단 중인 경우 모든 항목이 처리되면 재개됩니다(즉, 대기열에 put()된 모든 항목에 대해 task_done() 호출이 수신됨).

큐에 배치된 항목보다 더 많이 호출되면 ValueError를 발생시킵니다.

Queue.join()

대기열의 모든 항목을 가져와 처리할 때까지 차단합니다.

완료되지 않은 작업의 수는 항목이 대기열에 추가될 때마다 증가합니다. 항목이 검색되었고 모든 작업이 완료되었음을 나타내기 위해 소비자 스레드가 task_done()을 호출할 때마다 카운트가 감소합니다. 완료되지 않은 작업의 수가 0으로 떨어지면 join()이 차단을 해제합니다.

예시 코드

import queue
#maximum capacity of queue is 20
Q = queue.Queue(maxsize=40)
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print(Q.get())
print(Q.get())
print(Q.get())
print(Q.get())

출력

50
90
10
70

언더플로/오버플로의 예

import queue
Q = queue.Queue(maxsize=30)
print(Q.qsize())
Q.put(50)
Q.put(90)
Q.put(10)
Q.put(70)
print("Full: ", Q.full())
Q.put(90)
Q.put(100)
print("Full: ", Q.full())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print(Q.get())
print(Q.get())
print(Q.get())
print("Empty: ", Q.empty())
print("Full: ", Q.full())

출력

0
Full: False
Full: False
50
90
10
Empty: False
70
90
100
Empty: True
Full: False

스택의 예 3

import queue
S = queue.LifoQueue(maxsize=10)
# qsize() give the maxsize of
# the Queue
print(S.qsize())
S.put(50)
S.put(90)
S.put(10)
S.put(70)
S.put(90)
S.put(10)
print("Full: ", S.full())
print("Size: ", S.qsize())
# Data will be accessed in the
# reverse order Reverse of that
# of Queue
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print(S.get())
print("Empty: ", S.empty())

출력

0
Full: False
Size: 6
10
90
70
10
90
Empty: False