赞
踩
背景:python 队列 queue.Queue 或 multiprcessing.Queue 或其他队列在写入队列或从队列中读取元素时,都有可能会发生线程阻塞。
下面来说一下阻塞的类型,然后怎么避免阻塞~
一、阻塞的类型
队列的阻塞分为:入队(put)时的阻塞、出队(get)时的阻塞、整体(join)的阻塞(消费的阻塞)
二、入队的阻塞
importqueuedef入队阻塞():
q= queue.Queue(maxsize=3)for i in range(4):
q.put('任务' + str(i+1))print('Finished')if __name__ == '__main__':
入队阻塞()
注:因为定义的队列的 maxsize=3,但 put 了4个元素进队列,第4个元素将无法 put 进队列,发生阻塞;注意:就算不设置 maxsize,电脑的内存也是有限的,队列也是会满的。当队列已满,做 put 操作时,一样会发生阻塞。
正确的处理方法:
importqueuedef入队阻塞():
q= queue.Queue(maxsize=3)for i in range(4):try:
q.put('任务' + str(i+1), block=True, timeout=3)exceptqueue.Full:print('任务%d: 队列已满,写入失败' % (i+1))print('Finished')if __name__ &
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。