Python 队列(先进先出) 使用方法完整攻略
在 Python 中,队列是常见的数据结构之一,常用于数据的缓存、异步任务处理等场景中。Python原生支持队列的使用,本文将介绍Python队列的操作以及常见的使用方法。
初始化队列
首先,需要引入Python Queue模块。Python Queue分为两种: Queue 和 PriorityQueue。
import Queue
# 初始化 Queue 队列
q = Queue.Queue()
# 初始化 PrioriryQueue 队列
pq = Queue.PriorityQueue()
区别在于PriorityQueue由于可以设置优先级,因此入队时需要传入元组 (priority_number, value)。其余方法和Queue相同。
常用方法
Queue中常用的方法如下:
1. q.put(item):将item数据入队
2. q.get():返回队列中的第一个元素,并将其从队列中移除
3. q.qsize():返回队列中的元素个数
4. q.empty():如果队列为空,返回True,否则返回False
5. q.full():如果队列满了,返回True,否则返回False
PriorityQueue除此之外,还有以下两个方法:
1. pq.put(priority_number, item):将元组 (priority_number, item) 入队
2. pq.get():返回优先级最高的那个元素,并将其从队列中移除。若有多个优先级相等的元素,返回其中任意一个。
对于上述方法的使用,我们可以举出以下两个示例:
示例一:使用 Queue 完成异步任务
import Queue
import threading
import time
# 定义异步任务线程类
class AsyncTaskThread(threading.Thread):
def __init__(self, task_queue):
threading.Thread.__init__(self)
self.task_queue = task_queue
def run(self):
while True:
# 从队列中获取任务
task = self.task_queue.get()
# 执行任务
print('start task {}'.format(task))
time.sleep(1)
print('finish task {}'.format(task))
# 通知任务已完成
self.task_queue.task_done()
# 初始化队列
q = Queue.Queue()
# 添加任务
for i in range(5):
q.put(i)
# 启动两个线程,执行异步任务
for i in range(2):
t = AsyncTaskThread(q)
t.daemon = True
t.start()
# 等待任务完成
q.join()
该示例中,我们定义了一个 AsyncTaskThread 线程,通过 Queue 队列将任务添加到队列中,启动两个线程来执行异步任务。执行的任务相对较简单,每个任务只是暂停了一秒钟。注意,最后我们通过 task_done()
方法通知 Queue 该任务已完成。
示例二:使用 PriorityQueue 实现任务的优先级
import Queue
import threading
import time
# 定义任务类
class Task(object):
def __init__(self, priority, description):
self.priority = priority
self.description = description
def __cmp__(self, other):
return cmp(self.priority, other.priority)
# 定义异步任务线程类
class AsyncTaskThread(threading.Thread):
def __init__(self, task_queue):
threading.Thread.__init__(self)
self.task_queue = task_queue
def run(self):
while True:
# 从队列中获取任务
task = self.task_queue.get()
# 执行任务
print('start task {} with priority {}'.format(task.description, task.priority))
time.sleep(1)
print('finish task {} with priority {}'.format(task.description, task.priority))
# 通知任务已完成
self.task_queue.task_done()
# 初始化队列
pq = Queue.PriorityQueue()
# 添加任务
pq.put((1, Task(1, 'low priority task')))
pq.put((3, Task(3, 'high priority task')))
pq.put((2, Task(2, 'medium priority task')))
# 启动两个线程,执行异步任务
for i in range(2):
t = AsyncTaskThread(pq)
t.daemon = True
t.start()
# 等待所有任务完成
pq.join()
该示例中,我们使用 PriorityQueue 来实现任务的优先级控制。因为 PriorityQueue 本身支持元组 (priority, value) 的入队操作,因此我们通过封装 Task 类,并重载 __cmp__
方法以便于 PriorityQueue 进行优先级排序。其他部分和示例一类似。
以上是 Python 队列的常见操作和用法,这里只是对其进行了简单的介绍,更多详细的使用方法和注意事项,可以参考 Python 开发者文档。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:详解Python 队列(先进先出) - Python技术站