Advertisement
Guest User

Untitled

a guest
Jul 15th, 2019
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.89 KB | None | 0 0
  1. import heapq
  2. from collections import namedtuple
  3.  
  4. Task = namedtuple('Task', 'priority, id, content')
  5.  
  6.  
  7. class TaskFlow:
  8. def __init__(self):
  9. self._queue = []
  10. self._id = 0
  11.  
  12. def add_task(self, priority, content):
  13. self._id += 1
  14. # минус priority, чтобы доставать задачи с наибольшим приоритетом
  15. heapq.heappush(self._queue,
  16. Task(-priority, self._id, content))
  17. return self._id
  18.  
  19. def pop(self) -> Task:
  20. # мы извлекаем наименьший элемент
  21. # в кортеже 3 элемента, сравнение идет слева направо
  22. # сначала по приоритету с минусом (т.е. достаем наибольший приоритет)
  23. # если приотритеты равны, то с наименьшим id (т.е. тот, что был добавлен раньше)
  24. return heapq.heappop(self._queue)
  25.  
  26. def empty(self):
  27. return not self._queue
  28.  
  29.  
  30. flow = TaskFlow()
  31.  
  32. # добавим задачи в разнобой
  33. flow.add_task(90, 'умывание')
  34. flow.add_task(10, 'мыть тарелки')
  35. flow.add_task(100, 'подъем')
  36. # если приоритет одинаковый - сначала будет более раннее, затем позднее
  37. flow.add_task(50, 'готовить завтрак')
  38. flow.add_task(50, 'завтракать')
  39.  
  40. # пока есть задачи, будем доставать их и печатать
  41. while not flow.empty():
  42. print(flow.pop())
  43.  
  44. # вывод:
  45. # Task(priority=-100, id=3, content='подъем')
  46. # Task(priority=-90, id=1, content='умывание')
  47. # Task(priority=-50, id=4, content='готовить завтрак')
  48. # Task(priority=-50, id=5, content='завтракать')
  49. # Task(priority=-10, id=2, content='мыть тарелки')
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement