queue库提供了一个适用于多线程编程的先进先出(FIFO)数据结构,可以用来在生产者与消费者线程之间安全地传递消息或其他数据。它会为调用者处理锁定,使多个线程可以安全而更容易地处理同一个Queue实例。Queue的大小可能受限,以限制内存使用或处理。

 Python数据结构与算法—优先级队列Queue(python的优先级队列) Python 数据结构 算法 第1张

前言

queue库提供了一个适用于多线程编程的先进先出(FIFO)数据结构,可以用来在生产者与消费者线程之间安全地传递消息或其他数据。

它会为调用者处理锁定,使多个线程可以安全而更容易地处理同一个Queue实例。Queue的大小可能受限,以限制内存使用或处理。

基本用法

Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一端,使用get()从另一端删除。具体代码如下所示:

  1. importqueue
  2. q=queue.Queue()
  3. foriinrange(1,10):
  4. q.put(i)
  5. whilenotq.empty():
  6. print(q.get(),end="")

运行之后,效果如下:

 Python数据结构与算法—优先级队列Queue(python的优先级队列) Python 数据结构 算法 第2张

这里我们依次添加1到10到队列中,因为先进先出,所以出来的顺序也与添加的顺序相同。

LIFO队列

既然有先进先出队列queue,那么数据结构中肯定也有后进先出的队列。后进先出的队列为:LifoQueue,示例如下:

  1. importqueue
  2. q=queue.LifoQueue()
  3. foriinrange(1,10):
  4. q.put(i)
  5. whilenotq.empty():
  6. print(q.get(),end="")

运行之后,效果如下:

 Python数据结构与算法—优先级队列Queue(python的优先级队列) Python 数据结构 算法 第3张

优先队列

在操作系统中,我们常常会根据优先级来处理任务,比如系统的优先级最高,我们肯定优先处理系统任务,然后才处理用户的任务。同样,queue库给我们提供了PriorityQueue来处理优先级的队列。

示例如下:

  1. importqueue
  2. importthreading
  3. classJob:
  4. def__init__(self,priority,desc):
  5. self.priority=priority
  6. self.desc=desc
  7. print("NewJob:",desc)
  8. return
  9. def__eq__(self,other):
  10. try:
  11. returnself.priority==other.priority
  12. exceptAttributeError:
  13. returnNotImplemented
  14. def__lt__(self,other):
  15. try:
  16. returnself.priority>other.priority
  17. exceptAttributeError:
  18. returnNotImplemented
  19. defprocess_Job(q):
  20. whileTrue:
  21. next_job=q.get()
  22. print(next_job.desc)
  23. q.task_done()
  24. q=queue.PriorityQueue()
  25. q.put(Job(5,"FiveJob"))
  26. q.put(Job(15,"FifteenJob"))
  27. q.put(Job(1,"OneJob"))
  28. workers=[
  29. threading.Thread(target=process_Job,args=(q,)),
  30. threading.Thread(target=process_Job,args=(q,)),
  31. ]
  32. forworkinworkers:
  33. work.setDaemon(True)
  34. work.start()
  35. q.join()

运行之后,效果如下:

 Python数据结构与算法—优先级队列Queue(python的优先级队列) Python 数据结构 算法 第4张

这里,我们默认数值越大优先级越高,可以看到15先执行,然后再是5,1任务。这个例子展现了有多个线程在处理任务时,要根据get()时队列中元素的优先级来处理。

转载请说明出处
知优网 » Python数据结构与算法—优先级队列Queue(python的优先级队列)

发表评论

您需要后才能发表评论