Queue python

# -*-coding: utf-8 -*-
# Author :writen by Qiusheng Li
# Time: 2014/08/16
# Email:liqiusheng_123@hotmail.com
# enqueue Insert an item at the back of the queue
# dequeue Remove an item from the front of the queue
# peek/front Retrieve an item at front of the queue without removing it
# empty/size Check whether the queue is empty or return its size
# using list impliment the Queue

class Queue(object):
    '''a class of Queue'''
    def __init__(self):
        self.items = []
        
    def isEmpty(self):
        return self.items == []
    
    def enqueue(self, value):
        self.items.insert(0,value)# insert value before index(0)
        
    def peek(self):
        if not self.isEmpty():
            return self.items[-1]
        else:
            raise Exception("Queue is empty")
        
    def dequeue(self):
        return self.items.pop() # remove and return item at index(default last).
                                # Raises IndexError if list is empty or index is out of range
                                # without writing if code
    def size(self):
        return len(self.items)

def QueueMain():
    queue = Queue()
    queue.enqueue(1)
    queue.enqueue(2)
    queue.enqueue(3)
    print 'size or empty: ',queue.size()
    print 'peek: ',queue.peek()
    print 'dequeue: ',queue.dequeue()
    print 'size or empty: ',queue.size()
''' testinng result
size or empty:  3
peek:  1
dequeue:  1
size or empty:  2
'''
    
if __name__ == '__main__':
    QueueMain()
        

### 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` 对象用于操作该位置下的队列;最后通过循环不断尝试获取并显示队首的数据直至遇到异常为止(即队列已空)。这种方式非常适合那些希望即使进程意外终止也能保留未完成工作的场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值