queue模块提供了一个多线程安全的先进先出FIFO(first in first out)的数据结构。
1.基本使用
put()放入元素,get()取出元素。
import queue
q = queue.Queue()
for i in range(5):
q.put(i)
# 验证队列是否为空
while not q.empty():
print(q.get(), end=" ")
输出:
0 1 2 3 4
2.LIFO队列
与FIFO相反,LIFO是后进后出。
import queue
q = queue.LifoQueue()
for i in range(5):
q.put(i)
# 验证队列是否为空
while not q.empty():
print(q.get(), end=" ")
结果:
4 3 2 1 0
3.优先队列
根据元素的特性来决定这些元素的处理顺序。
import queue
import functools
import threading
@functools.total_ordering
class Job:
def __init__(self, priority, description):
self.priority = priority
self.description = description
print("New job:", description)
return
def __eq__(self, other):
try:
return self.priority == other.priority
except AttributeError:
return NotImplemented
def __lt__(self, other):
try:
return self.priority < other.priority
except AttributeError:
return NotImplemented
q = queue.PriorityQueue()
q.put(Job(3, "Mid-level job"))
q.put(Job(10, "Low-level job"))
q.put(Job(1, "Important job"))
def process_job(q):
while True:
# 根据优先级别来拿到新的工作,越重要的越先拿到
next_job = q.get()
print("processing job:", next_job.description, threading.current_thread().getName())
q.task_done()
workers = [
threading.Thread(name="Thread888", target=process_job, args=(q,))
]
for w in workers:
w.setDaemon(True)
w.start()
q.join()
显示结果:
New job: Mid-level job
New job: Low-level job
New job: Important job
processing job: Important job Thread888
processing job: Mid-level job Thread888
processing job: Low-level job Thread888