Python의 대기열 가이드

Python의 대기열 가이드

개요

간단한 정수 저장부터 복잡한 작업 흐름 관리에 이르기까지 데이터 구조는 강력한 애플리케이션을 위한 토대를 마련합니다. 그 중에는 변발 종종 흥미롭고 유비쿼터스적인 것으로 나타납니다. 생각해 보세요 - 아 은행에 줄을 서다, 패스트푸드 카운터에서 차례를 기다리는 것, 컴퓨터 시스템에서 작업을 버퍼링하는 것 등 이러한 모든 시나리오는 대기열의 메커니즘과 공감합니다.

줄을 서 있는 첫 번째 사람이 먼저 서비스를 받고, 새로 도착한 사람이 맨 마지막에 합류합니다. 이것은 실제 대기열의 실제 예입니다!

Guide-to-queues-in-python-01.png

개발자, 특히 Python의 경우 대기열은 컴퓨터 과학 교과서의 이론적 구성이 아닙니다. 이는 많은 애플리케이션에서 기본 아키텍처를 형성합니다. 프린터의 작업 관리부터 라이브 방송의 원활한 데이터 스트리밍 보장에 이르기까지 대기열은 필수적인 역할을 합니다.

이 가이드에서는 대기열의 개념을 깊이 파고들어 대기열의 특성, 실제 응용 프로그램, 그리고 가장 중요하게 Python에서 대기열을 효과적으로 구현하고 사용하는 방법을 탐구합니다.

대기열 데이터 구조란 무엇입니까?

데이터 구조를 탐색하다 보면 데이터 입력 및 검색에 대한 고유한 규칙이 있는 컨테이너를 자주 접하게 됩니다. 이 중, 변발 우아함과 솔직함이 돋보입니다.

FIFO 원칙

기본적으로 큐는 다음을 준수하는 선형 데이터 구조입니다. 선입선출(FIFO) 원칙. 이는 대기열에 추가된 첫 번째 요소가 제거되는 첫 번째 요소가 됨을 의미합니다. 이를 관련 시나리오에 비유하려면 매표소에 줄지어 있는 고객을 생각해 보세요. 먼저 도착한 사람이 먼저 티켓을 받고, 그 다음 도착하는 사람도 맨 마지막에 줄을 서서 차례를 기다립니다.

참고 : 대기열에는 두 개의 끝이 있습니다. 후면 및 전면. 앞면은 요소가 제거될 위치를 나타내고 뒷면은 새 요소가 추가될 위치를 나타냅니다.

기본 대기열 작업

  • 대기열에 넣기 – 행위 첨가 끝까지 요소 (후방) 대기열의

    Guide-to-queues-in-python-02.png

  • 대기열에서 빼기 – 행위 제거 의 요소 대기열의.

    Guide-to-queues-in-python-03.png

  • 엿보기 또는 전면 – 대부분의 경우 전면 요소를 제거하지 않고 관찰하는 것이 좋습니다. 이 작업을 통해 우리는 바로 그 일을 할 수 있습니다.

  • 비었다 – 대기열에 요소가 있는지 확인하는 데 도움이 되는 작업입니다. 이는 데이터가 있는 큐에 따라 작업이 결정되는 시나리오에서 매우 중요할 수 있습니다.

참고 : 일부 대기열은 크기가 제한되어 있지만(제한된 대기열) 다른 대기열은 시스템 메모리가 허용하는 한 잠재적으로 커질 수 있습니다(제한되지 않은 대기열).

대기열의 단순성과 명확한 작동 규칙은 소프트웨어 개발의 다양한 애플리케이션, 특히 질서 있고 체계적인 처리가 필요한 시나리오에 이상적입니다.

그러나 이론을 이해하는 것은 첫 번째 단계일 뿐입니다. 앞으로 나아가면서 Python에서 큐를 구현하는 방법을 설명하면서 실용적인 측면을 탐구하겠습니다.

Python에서 대기열을 구현하는 방법 – 목록 대 Deque 대 대기열 모듈

풍부한 표준 라이브러리와 사용자 친화적인 구문을 갖춘 Python은 대기열을 구현하고 작업할 수 있는 여러 메커니즘을 제공합니다. 모두 대기열 관리의 기본 목적을 수행하지만 미묘한 차이, 장점 및 잠재적인 함정이 있습니다. 각 접근 방식을 분석하여 해당 메커니즘과 최상의 사용 사례를 보여드리겠습니다.

참고 : 작업을 수행하기 전에 항상 대기열 상태를 확인하세요. 예를 들어 대기열에서 빼기 전에 오류를 방지하려면 대기열이 비어 있는지 확인하세요. 마찬가지로 제한된 대기열의 경우 대기열에 넣기 전에 공간이 있는지 확인하세요.

Python 목록을 사용하여 대기열 구현

Python의 내장 목록을 사용하여 대기열을 구현하는 것은 직관적이고 간단합니다. 외부 라이브러리나 복잡한 데이터 구조가 필요하지 않습니다. 그러나 이 접근 방식은 대규모 데이터 세트에는 효율적이지 않을 수 있습니다. 목록의 시작 부분에서 요소 제거(pop(0)) 선형 시간이 걸리므로 성능 문제가 발생할 수 있습니다.

참고 : 고성능을 요구하는 애플리케이션이나 상당한 양의 데이터를 처리하는 애플리케이션의 경우 collections.deque 대기열에 넣기와 대기열에서 빼기 모두에 대한 지속적인 시간 복잡도.

대기열을 나타내는 목록을 만드는 것부터 시작해 보겠습니다.

queue = []

큐의 끝에 요소를 추가하는(인큐잉) 프로세스는 해당 요소를 목록에 추가하는 것 외에는 아무것도 아닙니다.


queue.append('A')
queue.append('B')
queue.append('C')
print(queue) 

또한 대기열 앞쪽에서 요소를 제거하는 것(큐 제거)은 목록의 첫 번째 요소를 제거하는 것과 동일합니다.


queue.pop(0)
print(queue) 

사용 컬렉션. 데크 대기열 구현

이 접근 방식은 다음과 같이 매우 효율적입니다. deque 사용하여 구현됩니다 이중 연결 리스트. 양쪽 끝에서 빠른 O(1) 추가 및 팝을 지원합니다. 이 접근 방식의 단점은 다음과 같습니다. 약간 초보자에게는 덜 직관적입니다.

우선, 우리는 deque 에서 개체 collections 모듈을 만들고 대기열을 초기화합니다.

from collections import deque queue = deque()

이제 우리는 append() 요소를 대기열에 추가하는 방법과 popleft() 대기열에서 요소를 제거하는 방법:

모범 사례, 업계에서 인정하는 표준 및 포함된 치트 시트가 포함된 Git 학습에 대한 실습 가이드를 확인하십시오. 인터넷 검색 Git 명령을 중지하고 실제로 배움 이것!


queue.append('A')
queue.append('B')
queue.append('C')
print(queue) queue.popleft()
print(queue) 

파이썬 사용하기 변발 대기열 구현을 위한 모듈

XNUMXD덴탈의 queue Python 표준 라이브러리의 모듈은 다양한 사용 사례에 맞춰 대기열 관리에 대한 보다 전문적인 접근 방식을 제공합니다.

  • 단순 대기열 – 기본 FIFO 대기열
  • Lifo큐 – LIFO 대기열, 본질적으로 스택
  • 우선순위 큐 – 요소는 할당된 우선순위에 따라 대기열에서 제외됩니다.

참고 : 선택 queue 모듈은 다음과 같이 설계되었습니다. 스레드로부터 안전한. 이렇게 하면 대기열의 동시 작업으로 인해 예측할 수 없는 결과가 발생하지 않습니다.

이 접근 방식은 대기열 작업을 위해 명시적으로 설계되었기 때문에 훌륭합니다. 그러나 솔직히 말해서 단순한 시나리오에서는 과잉일 수 있습니다.

이제 사용을 시작해 보겠습니다. queue 모듈을 프로젝트로 가져와서:

import queue

간단한 FIFO 대기열을 구현하고 있으므로 다음을 사용하여 초기화하겠습니다. SimpleQueue() 건설자:

q = queue.SimpleQueue()

대기열에 넣기 및 대기열에서 빼기 작업은 다음을 사용하여 구현됩니다. put()get() 의 방법 queue 기준 치수:


q.put('A')
q.put('B')
q.put('C')
print(q.queue) q.get()
print(q.queue) 

참고 : 대기열 작업은 처리되지 않은 경우 애플리케이션의 흐름을 방해할 수 있는 예외를 발생시킬 수 있습니다. 이를 방지하려면 대기열 작업을 try-except 블록.

예를 들어, queue.Empty 작업할 때 예외 queue 기준 치수:

import queue q = queue.SimpleQueue() try: item = q.get_nowait()
except queue.Empty: print("Queue is empty!")

어떤 구현을 선택해야 할까요?

Python에서 선택한 대기열 구현은 애플리케이션의 요구 사항과 일치해야 합니다. 대용량 데이터를 처리하거나 최적화된 성능이 필요한 경우 collections.deque 설득력있는 선택입니다. 그러나 다중 스레드 응용 프로그램의 경우 또는 우선 순위가 적용되는 경우 queue 모듈은 강력한 솔루션을 제공합니다. 빠른 스크립트의 경우 또는 방금 시작하는 경우 Python 목록으로 충분할 수 있지만 잠재적인 성능 저하에 항상 주의하십시오.

참고 : Python이 이미 강력한 내장 솔루션을 제공하는 경우 대기열 작업을 사용자 정의하여 구현하여 바퀴를 재창조합니다.
맞춤형 솔루션을 만들기 전에 다음과 같은 Python의 내장 기능을 숙지하세요. deque 그리고 queue 기준 치수. 대개 광범위한 요구 사항을 충족하여 시간을 절약하고 잠재적인 오류를 줄입니다.

더 자세히 알아보기: Python의 고급 대기열 개념

대기열의 기본 메커니즘을 이해하고 더 깊이 탐구하려는 사람들을 위해 Python은 대기열 기반 작업을 개선하고 최적화하기 위한 다양한 고급 개념과 기술을 제공합니다. 보다 복잡한 시나리오를 처리할 수 있는 도구 모음을 제공하여 이러한 정교한 측면 중 일부를 살펴보겠습니다.

양방향 대기열 데크

우리가 이전에 탐색한 동안 deque FIFO 대기열로서 LIFO(Last-In-First-Out) 작업도 지원합니다. O(1) 복잡도로 양쪽 끝에서 요소를 추가하거나 팝할 수 있습니다.

from collections import deque dq = deque()
dq.appendleft('A') dq.append('B') dq.pop() dq.popleft() 

우선순위큐 실천 중

처리 순서가 우선순위에 따라 달라질 때 간단한 FIFO 대기열을 사용하면 비효율적이거나 원치 않는 결과가 발생할 수 있습니다. 따라서 애플리케이션에서 특정 기준에 따라 특정 요소를 다른 요소보다 먼저 처리해야 하는 경우 PriorityQueue. 이렇게 하면 설정된 우선순위에 따라 요소가 처리됩니다.

대기열에 추가하는 요소의 우선순위를 어떻게 설정하는지 살펴보세요. 이를 위해서는 튜플을 인수로 전달해야 합니다. put() 방법. 튜플은 첫 번째 요소로 우선순위를 포함하고 두 번째 요소로 실제 값을 포함해야 합니다.

import queue pq = queue.PriorityQueue()
pq.put((2, "Task B"))
pq.put((1, "Task A")) pq.put((3, "Task C")) while not pq.empty(): _, task = pq.get() print(f"Processing: {task}")

이것은 우리에게 다음을 줄 것입니다:

Processing: Task A
Processing: Task B
Processing: Task C

큐에 저장된 순서와 다른 순서로 요소를 추가한 방법에 주목하세요. 이는 우리가 할당한 우선순위 때문입니다. put() 우선순위 큐에 요소를 추가할 때 메서드입니다.

순환 대기열 구현

순환 큐(또는 링 버퍼)는 마지막 요소가 첫 번째 요소에 연결되어 순환 흐름을 보장하는 고급 데이터 구조입니다. deque 다음을 사용하여 이 동작을 모방할 수 있습니다. maxlen 재산:

from collections import deque circular_queue = deque(maxlen=3)
circular_queue.append(1)
circular_queue.append(2)
circular_queue.append(3) circular_queue.append(4)
print(circular_queue) 

결론

기본적이면서도 강력한 큐는 다양한 실제 애플리케이션과 계산 문제에서 그 본질을 찾습니다. 운영 체제의 작업 예약부터 인쇄 스풀러 또는 웹 서버 요청의 데이터 흐름 관리에 이르기까지 대기열의 의미는 광범위합니다.

Python은 대기열 작업을 위한 풍부한 도구 및 라이브러리 팔레트를 제공합니다. 빠른 스크립트를 위한 간단한 목록 기반 대기열부터 매우 효율적인 스크립트까지 deque 성능이 중요한 애플리케이션의 경우 언어는 실제로 다양한 요구 사항을 충족합니다.

타임 스탬프 :

더보기 스택카부스