Skip to content

Instantly share code, notes, and snippets.

@tirinox
Created July 4, 2019 07:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tirinox/f59cbfd95d28f83bc5b3668da9070304 to your computer and use it in GitHub Desktop.
Save tirinox/f59cbfd95d28f83bc5b3668da9070304 to your computer and use it in GitHub Desktop.
import heapq
from collections import namedtuple
Task = namedtuple('Task', 'priority, id, content')
class TaskFlow:
def __init__(self):
self._queue = []
self._id = 0
def add_task(self, priority, content):
self._id += 1
# минус priority, чтобы доставать задачи с наибольшим приоритетом
heapq.heappush(self._queue,
Task(-priority, self._id, content))
return self._id
def pop(self) -> Task:
# мы извлекаем наименьший элемент
# в кортеже 3 элемента, сравнение идет слева направо
# сначала по приоритету с минусом (т.е. достаем наибольший приоритет)
# если приотритеты равны, то с наименьшим id (т.е. тот, что был добавлен раньше)
return heapq.heappop(self._queue)
def empty(self):
return not self._queue
flow = TaskFlow()
# добавим задачи в разнобой
flow.add_task(90, 'умывание')
flow.add_task(10, 'мыть тарелки')
flow.add_task(100, 'подъем')
# если приоритет одинаковый - сначала будет более раннее, затем позднее
flow.add_task(50, 'готовить завтрак')
flow.add_task(50, 'завтракать')
# пока есть задачи, будем доставать их и печатать
while not flow.empty():
print(flow.pop())
# вывод:
# Task(priority=-100, id=3, content='подъем')
# Task(priority=-90, id=1, content='умывание')
# Task(priority=-50, id=4, content='готовить завтрак')
# Task(priority=-50, id=5, content='завтракать')
# Task(priority=-10, id=2, content='мыть тарелки')
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment