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

Python에서 우선 순위 대기열을 구현하는 방법은 무엇입니까?

<시간/>

소개...

대기열 모듈은 다중 스레드 프로그래밍에 적합한 FIFO(선입선출), LIFO(후입선출) 데이터 구조를 제공합니다. 큐는 데이터 또는 광범위한 정보를 전달하는 데 사용할 수 있습니다. 세션 세부 정보, 경로, 변수, .. 생성자와 소비자 스레드 사이를 안전하게 보호합니다. 잠금은 일반적으로 호출자에 대해 처리됩니다.

참고 참고:이 토론에서는 대기열의 일반적인 특성을 이미 이해하고 있다고 가정합니다. 그렇지 않은 경우 계속하기 전에 참고 문헌 중 일부를 읽을 수 있습니다.

1. 기본 FIFO 대기열을 구현해 보겠습니다.

import queue
fifo = queue.Queue()

# put numbers into queue
for i in range(5):
fifo.put(i)

# if not empty get the numbers from queue
print(f"Ouput \n")
while not fifo.empty():
print(f" {fifo.get()} ")

출력

0
1
2
3
4

2. 위의 예는 단일 스레드를 사용하여 요소가 삽입된 것과 동일한 순서로 큐에서 요소가 제거되는 방법을 보여줍니다.

3. 기본 LIFO 대기열을 구현해 보겠습니다.

import queue
lifo = queue.LifoQueue()

# put numbers into queue
for i in range(5):
lifo.put(i)

print(f"Ouput \n")
# if not empty get the numbers from queue
while not lifo.empty():
print(f" {lifo.get()} ")

출력

4
3
2
1
0

4. 위의 예는 가장 최근에 큐에 넣은 것을 get에 의해 제거하는 것을 보여줍니다.

5. 마지막으로 우선순위 큐를 구현하는 방법을 살펴보겠습니다.

때때로 대기열에 있는 항목의 처리 순서는 항목이 생성되거나 대기열에 추가되는 순서가 아니라 해당 항목의 우선 순위를 기반으로 해야 합니다. 예를 들어, producton에서 실행되는 비즈니스 크리티컬 작업은 개발자가 인쇄하려는 인쇄 작업보다 높은 CPU와 우선 순위를 필요로 합니다. PriorityQueue는 대기열 내용의 정렬 순서를 사용하여 검색할 항목을 결정합니다.

import queue
import threading

# Class to get the priority and description and validate the priority
class Job:
def __init__(self, priority, description):
self.priority = priority
self.description = description
print('New job:', description)
return

def __eq__(self, other):
try:
return self.priority == other.priority
except AttributeError:
return NotImplemented

def __lt__(self, other):
try:
return self.priority < other.priority
except AttributeError:
return NotImplemented

# create a priority queue and define the priority
q = queue.PriorityQueue()
q.put(Job(90, 'Developer-Print job'))
q.put(Job(2, 'Business-Report job'))
q.put(Job(1, 'Business-Critical Job'))

# process the job
def process_job(q):
while True:
next_job = q.get()
print(f" *** Now, Processing the job - {next_job.description}")
q.task_done()

# define the threads
workers = [
threading.Thread(target=process_job, args=(q,)),
threading.Thread(target=process_job, args=(q,)), ]

# call the threads and join them.
for w in workers:
w.setDaemon(True)
w.start()

q.join()

출력

job: Developer-Print job
New job: Business-Report job
New job: Business-Critical Job

출력

*** Now, Processing the job - Business-Critical Job
*** Now, Processing the job - Business-Report job
*** Now, Processing the job - Developer-Print job

6. 이 예제에는 get()이 호출될 때 대기열에 있는 항목의 우선 순위에 따라 처리되는 작업을 사용하는 여러 스레드가 있습니다. 처리 순서는 추가된 순서와 상관없이 비즈니스 중요도를 기반으로 합니다.