python queue【队列的阻塞】

文章介绍了Python中线程和队列的使用,特别是队列的阻塞机制,包括入队、出队和整体阻塞。在出队时,可以通过设置timeout或使用get_nowait方法处理阻塞。同时,强调了Queue.task_done()函数的作用,它用于通知队列一个任务已完成,帮助join()函数判断队列是否已清空。
摘要由CSDN通过智能技术生成

队列的阻塞分为:入队(put)时的阻塞、出队(get)时的阻塞、整体(join)的阻塞(消费的阻塞)
出队阻塞()
注:设置 timeout 超时时间,并捕捉 queue.Empty 异常;设置tomeout一样会阻塞线程,但timeout之后,可以继续操行程序。如果不想使用 timeout 选项,也可以直接设置 block(阻塞) 为 False,或者直接使用 q.get_nowait 方法(注意:当队列为空的时候 ,get_nowait 一样会触发 queue.Empty 异常)

import threading
import queue
from time import sleep
 
 
# 之所以为什么要用线程,因为线程可以start后继续执行后面的主线程,可以put数据,如果不是线程直接在get阻塞。
class Mythread(threading.Thread):
    def __init__(self, que):
        threading.Thread.__init__(self)
        self.queue = que
 
    def run(self):
        while True:
            sleep(1)
            if self.queue.empty():
                # 判断放到get前面,这样可以,否则队列最后一个取完后就空了,直接break,走不到print
                break
 
            item = self.queue.get()
            print(item, '...')
            self.queue.task_done()
            """
            如果把self.queue.task_done()  注释去掉,就会顺利执行完主程序。
            这就是“Queue.task_done()函数向任务已经完成的队列发送一个信号”这句话的意义,能够让join()函数能判断出队列还剩多少,是否清空了。
            """
 
        return
 
 
myque = queue.Queue()
tasks = [Mythread(myque) for x in range(2)]  # 2个线程
# print(tasks)
for x in range(10):
    myque.put(x)  # 快速生产
 
for x in tasks:
    t = Mythread(myque)  # 把同一个队列传入2个线程
    t.start()
 
myque.join()
 
print("---finish---")

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值