详解Python 队列(先进先出)

  • Post category:Python

Python有一个内置的模块Queue,提供了队列的实现。队列是一种数据结构,遵循先进先出(FIFO)原则。这意味着添加到队列的第一个元素首先会被取出。下面我们来详细讲解Python队列使用方法的完整攻略。

创建一个队列

首先,我们需要导入Queue模块。然后使用Queue类创建一个队列对象,如下所示:

import queue

q = queue.Queue()

现在我们已经创建了一个空队列对象,它还没有包含任何元素。

向队列中添加元素

我们可以使用put()方法向队列中添加元素。例如,在下面的示例中,我们向队列中添加了三个元素:

import queue

q = queue.Queue()

q.put(10)
q.put(20)
q.put(30)

我们还可以使用循环向队列中添加元素,例如:

import queue

q = queue.Queue()

for i in range(5):
    q.put(i * 10)

从队列中获取元素

我们可以使用get()方法从队列中获取元素。例如,在下面的示例中,我们获取队列中的第一个元素和第二个元素:

import queue

q = queue.Queue()

q.put(10)
q.put(20)
q.put(30)

print(q.get())
print(q.get())

输出结果为:

10
20

如果队列为空,调用get()方法会阻塞线程,直到有元素可用。

我们也可以使用循环获取所有元素,例如:

import queue

q = queue.Queue()

q.put(10)
q.put(20)
q.put(30)

while not q.empty():
    print(q.get())

输出结果为:

10
20
30

这个例子中我们使用了empty()方法来判断队列是否为空。如果队列为空,则退出循环。

设置队列的大小

我们还可以设置队列的大小,例如:

import queue

q = queue.Queue(maxsize=3)

q.put(10)
q.put(20)
q.put(30)
q.put(40)  # 队列已满,抛出queue.Full异常

我们在创建Queue对象时将maxsize参数设置为3,这意味着队列最多只能包含3个元素。当我们尝试向队列中添加第四个元素时,会抛出queue.Full异常。

示例

现在,我们来看一些使用队列的示例:

示例1:使用队列实现生产者消费者模式

生产者-消费者模式是基于队列的一种常见的并发模式。在该模式中,一个或多个生产者向队列中添加元素,一个或多个消费者从队列中获取元素。

下面的示例演示了如何使用队列来实现生产者消费者模式:

import queue
import threading
import time

q = queue.Queue()

class Producer(threading.Thread):
    def run(self):
        for i in range(5):
            q.put(i)
            print(f"生产者生产了{i}")
            time.sleep(1)

class Consumer(threading.Thread):
    def run(self):
        for i in range(5):
            item = q.get()
            print(f"消费者消费了{item}")
            time.sleep(2)

p = Producer()
c = Consumer()

p.start()
c.start()

p.join()
c.join()

print("完成")

输出结果为:

生产者生产了0
消费者消费了0
生产者生产了1
生产者生产了2
生产者生产了3
生产者生产了4
消费者消费了1
消费者消费了2
消费者消费了3
消费者消费了4
完成

在该示例中,我们创建了一个队列q。生产者使用put()方法向队列中添加元素,消费者使用get()方法从队列中获取元素。

我们还创建了两个线程,生产者线程和消费者线程。生产者线程的run()方法在循环中使用put()方法向队列中添加元素,消费者线程的run()方法在循环中使用get()方法从队列中获取元素。生产者线程和消费者线程在启动后,通过join()方法等待彼此结束后再退出。