queue python
时间: 2025-01-04 22:35:44 浏览: 8
### Python 队列的实现与使用
#### 使用 `queue.Queue` 实现线程安全队列
Python 的标准库提供了 `queue.Queue` 类来创建线程安全的队列。这个类实现了多生产者/消费者队列,适用于在多个线程之间传递数据。
```python
from queue import Queue
import threading
def producer(queue, item):
queue.put(item)
def consumer(queue):
while True:
item = queue.get()
if item is None:
break
print(f'Processing {item}')
queue.task_done()
q = Queue(maxsize=0) # 创建一个无限大小的FIFO队列
# 启动消费者线程
consumer_thread = threading.Thread(target=consumer, args=(q,), daemon=True)
consumer_thread.start()
# 生产者向队列中放入项目
for i in range(5):
q.put(i)
# 等待所有项被处理完毕
q.join()
print('All items processed.')
```
上述代码展示了如何利用 `Queue` 来协调两个独立运行的任务——生产和消费[^1]。
#### 自定义磁盘持久化队列
对于需要更高可靠性的应用场景,可以考虑基于文件系统的持久化队列解决方案。`persist-queue` 是这样一个第三方包,它提供了一个线程安全、基于磁盘存储的队列选项,适合长时间运行的应用程序或重启后仍需保持状态的情况。
安装 persist-queue 及其依赖:
```bash
pip install persist-queue
```
下面是一个简单的例子展示如何使用 `PDict` 和 `FIFODisk` 构建自定义的持久化 FIFO 队列:
```python
from persist_queue import FIFODisk as QueueDisk
import os.path
queue_path = './myqueue'
if not os.path.exists(queue_path):
os.makedirs(queue_path)
q_disk = QueueDisk(queue_path)
# 添加元素到队列
for num in range(10):
q_disk.put(str(num))
# 从队列读取并打印第一个元素直到为空
while True:
try:
data = q_disk.get_nowait()
print(data.decode())
except Exception as e:
break
```
此段脚本先检查指定路径是否存在,如果不存在则创建目录;接着实例化一个新的 `FIFODisk` 对象用于操作该位置下的队列;最后通过循环不断尝试获取并显示队首的数据直至遇到异常为止(即队列已空)。这种方式非常适合那些希望即使进程意外终止也能保留未完成工作的场景。
阅读全文