队列模块提供适用于多线程编程的先进先出(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()
调用时队列中项目的优先级进行处理。处理顺序基于业务关键性,而与添加顺序无关。