前言队列库提供了适合多线程编程的先进先出(FIFO)数据结构,可用于生产者线程和消费者线程之间安全传递消息或其他数据。它为调用者处理锁定,使多个线程在同一个Queue实例上工作更安全、更容易。队列的大小可能会受到限制,以限制内存使用或处理。基本用法Queue类实现了一个基本的先进先出容器。使用put()将元素添加到此序列的一端,并使用get()从另一端删除元素。具体代码如下:importqueueq=queue.Queue()foriinrange(1,10):q.put(i)whilenotq.empty():print(q.get(),end="")运行后,效果如下:这里我们依次往队列中加入1到10,因为先进先出,所以出来的顺序也和加入的顺序一样。由于后进先出队列具有先进先出队列,因此在数据结构中也必然存在后进先出队列。后进先出队列为:LifoQueue,示例如下:importqueueq=queue.LifoQueue()foriinrange(1,10):q.put(i)whilenotq.empty():print(q.get(),end="")运行后效果如下:优先级队列在操作系统中,我们经常根据任务的优先级来处理任务。例如,系统具有最高优先级。我们必须先处理系统任务,再处理用户任务。同样,队列库为我们提供了PriorityQueue来处理优先级队列。示例如下:importqueueimportthreadingclassJob:def__init__(self,priority,desc):self.priority=priorityself.desc=descprint("NewJob:",desc)returndef__eq__(self,other):try:returnsself.priority==other。priorityexceptAttributeError:returnNotImple__menteddef__(self,other):try:returnself.priority>other.priorityexceptAttributeError:returnNotImplementeddefprocess_Job(q):whileTrue:next_job=q.get()打印(next_job.desc)q.task_done()q=queue.PriorityQueue()q。put(Job(5,"FiveJob"))q.put(Job(15,"FifteenJob"))q.put(Job(1,"OneJob"))workers=[threading.Thread(target=process_Job,args=(q,)),threading.Thread(target=process_Job,args=(q,)),]forworkinworkers:work.setDaemon(True)work.start()q.join()运行后效果如下:这里,我们默认值越大,优先级越高。可以看到先执行15,再执行5、1任务。这个例子表明,当多个线程在处理任务时,在get()时应该按照队列中元素的优先级进行处理。
