前言
queue库提供了一个适用于多线程编程的先进先出(FIFO)数据结构,可以用来在生产者与消费者线程之间安全地传递消息或其他数据。
它会为调用者处理锁定,使多个线程可以安全而更容易地处理同一个Queue实例。Queue的大小可能受限,以限制内存使用或处理。
基本用法
Queue类实现了一个基本的先进先出容器。使用put()将元素增加到这个序列的一端,使用get()从另一端删除。具体代码如下所示:
- import queue
- q = queue.Queue()
- for i in range(1, 10):
- q.put(i)
- while not q.empty():
- print(q.get(), end=" ")
运行之后,效果如下:
这里我们依次添加1到10到队列中,因为先进先出,所以出来的顺序也与添加的顺序相同。
LIFO队列
既然有先进先出队列queue,那么数据结构中肯定也有后进先出的队列。后进先出的队列为:LifoQueue,示例如下:
- import queue
- q = queue.LifoQueue()
- for i in range(1, 10):
- q.put(i)
- while not q.empty():
- print(q.get(), end=" ")
运行之后,效果如下:
优先队列
在操作系统中,我们常常会根据优先级来处理任务,比如系统的优先级最高,我们肯定优先处理系统任务,然后才处理用户的任务。同样,queue库给我们提供了PriorityQueue来处理优先级的队列。
示例如下:
- import queue
- import threading
- class Job:
- def __init__(self, priority, desc):
- self.priority = priority
- self.desc = desc
- print("New Job:", desc)
- 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
- def process_Job(q):
- while True:
- next_job = q.get()
- print(next_job.desc)
- q.task_done()
- q = queue.PriorityQueue()
- q.put(Job(5, "Five Job"))
- q.put(Job(15, "Fifteen Job"))
- q.put(Job(1, "One Job"))
- workers = [
- threading.Thread(target=process_Job, args=(q,)),
- threading.Thread(target=process_Job, args=(q,)),
- ]
- for work in workers:
- work.setDaemon(True)
- work.start()
- q.join()
运行之后,效果如下:
这里,我们默认数值越大优先级越高,可以看到15先执行,然后再是5,1任务。这个例子展现了有多个线程在处理任务时,要根据get()时队列中元素的优先级来处理。