要避免死锁,必须确保每个q.get()都有对应的q.task_done(),即使发生异常也应在finally块中调用q.task_done();1. 设置q.get()的超时时间以防止无限阻塞;2. 避免多个队列间的循环依赖;3. 必要时使用threading.lock进行细粒度控制;当队列满时,应捕获queue.full异常并采取重试、丢弃、转存或扩容等措施;除了queue.queue,还可根据场景选择queue.lifoqueue实现后进先出、queue.priorityqueue按优先级处理任务,或结合threading.lock使用collections.deque实现线程安全的双端队列,所有方案均需保证资源释放和操作原子性以避免死锁,最终确保多线程环境下队列操作的安全与高效。

在Python中实现多线程安全队列,关键在于使用
queue
import queue
import threading
import time
# 创建一个线程安全的队列
q = queue.Queue()
def worker(num):
while True:
try:
# 从队列中获取一个任务,如果没有任务则阻塞,直到有任务
item = q.get(timeout=1) # 设置超时时间,避免无限阻塞
print(f"线程 {num} 正在处理: {item}")
time.sleep(1) # 模拟处理任务的时间
print(f"线程 {num} 完成处理: {item}")
except queue.Empty:
print(f"线程 {num} 退出,队列为空")
break # 队列为空,退出线程
finally:
q.task_done() # 通知队列,任务已完成
# 创建多个线程
threads = []
for i in range(3):
t = threading.Thread(target=worker, args=(i,))
threads.append(t)
t.daemon = True # 设置为守护线程,主线程退出时自动退出
t.start()
# 向队列中添加任务
for i in range(10):
q.put(i)
# 等待队列中的所有任务完成
q.join()
print("所有任务完成")死锁通常发生在多个线程互相等待对方释放资源的情况下。在使用
queue
q.get()
q.task_done()
q.join()
避免死锁的关键在于:
立即学习“Python免费学习笔记(深入)”;
q.get()
q.task_done()
finally
q.task_done()
q.get()
q.get(timeout=...)
threading.Lock
queue
threading.Lock
queue.Full
当使用
queue.Queue
maxsize
queue.Full
捕获queue.Full
q.put()
try...except
queue.Full
处理队列已满的情况:在捕获到
queue.Full
time.sleep()
import queue
import threading
import time
q = queue.Queue(maxsize=5) # 创建一个最大容量为5的队列
def producer():
for i in range(10):
try:
q.put(i, timeout=1) # 设置超时时间,避免无限阻塞
print(f"生产者添加: {i}")
time.sleep(0.5)
except queue.Full:
print(f"队列已满,生产者等待...")
time.sleep(1) # 等待一段时间后重试
def consumer(num):
while True:
try:
item = q.get(timeout=1)
print(f"消费者 {num} 消费: {item}")
time.sleep(1)
q.task_done()
except queue.Empty:
print(f"消费者 {num} 退出,队列为空")
break
# 创建生产者和消费者线程
producer_thread = threading.Thread(target=producer)
consumer_thread1 = threading.Thread(target=consumer, args=(1,))
consumer_thread2 = threading.Thread(target=consumer, args=(2,))
producer_thread.start()
consumer_thread1.start()
consumer_thread2.start()
producer_thread.join()
q.join() # 等待队列为空
print("所有任务完成")queue.Queue
除了
queue.Queue
queue.LifoQueue
put()
get()
queue.PriorityQueue
put()
get()
put()
collections.deque
collections.deque
threading.Lock
queue.Queue
选择哪种队列取决于具体的应用场景。如果需要先进先出的队列,
queue.Queue
queue.LifoQueue
queue.PriorityQueue
collections.deque
threading.Lock
以上就是Python如何实现多线程安全队列?queue模块线程同步的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号