python队列

本文介绍了Python中的Queue模块,包括FIFO、LIFO和优先级队列的使用。通过实例展示了队列的put、get等方法以及线程同步的task_done和join方法。此外,还利用队列实现了一个简单的生产者消费者模式,其中生产者线程生成数据并放入队列,消费者线程从队列中取出并处理数据。
摘要由CSDN通过智能技术生成

一,python队列

Python的Queue模块中提供了同步的、线程安全的队列类,包括FIFO(先入先出)队列Queue,LIFO(后入先出)队列LifoQueue,和优先级队列PriorityQueue。这些队列都实现了锁原语,能够在多线程中直接使用。可以使用队列来实现线程间的同步。

#队列
#put() put_nowait()   get()  get_nowait()  qsize()   full()  empty()  task_down()任务完成返回消息  join()  收到后继续主线程
q = queue.Queue(maxsize=3)  #创建一个队列,参数指定队列长度最大为3
q.put(1)  #将1放入队列
q.put_nowait(2) #等同于q.put(timeout=True)
print(q.get())  #获取一个值,先入先出
print(q.get_nowait())q.get(timeout=True)
print(q.qsize()) # 2个值已经被取出了,所以队列长度为0
print(q.full()) #查看队列是否满了
print(q.empty()) #查看队列是否为空
q.task_done() #告诉主线程我已经完成了一个任务了
q.join() #所有任务完成再进行下面的代码即主线程
print("任务执行完成!!!")
#输出--------------------------------
1
2
0
False
True

以上代码为什么没有打印最后一句话,因为队列里面2个任务,q.task_done()只返回了一个任务完成,所以一直在等待,不会执行执行主线程代码;
如果我们收到两个q.task_done(),那就可以正常执行了,如下

q = queue.Queue(maxsize=3)  #创建一个队列,参数指定队列长度最大为3
q.put(1)  #将1放入队列
q.put_nowait(2)
print(q.get())  #获取一个值
print(q.get_nowait())
print(q.qsize()) # 2个值已经被取出了,所以队列长度为0
print(q.full()) #查看队列是否满了
print(q.empty()) #查看队列是否为空
q.task_done() #告诉主线程我已经完成了一个任务了
q.task_done()
q.join() #所有任务完成再进行下面的代码即主线程
print("任务执行完成!!!")
#输出----------------------------------------
1
2
0
False
True
任务执行完成!!!

二,先入后出队列

可以看到先放进队列的后被取出,其他用法和(先入先出)队列Queue一样;

q2 = queue.LifoQueue()
q2.put(1)
q2.put(2)
print(q2.get())
print(q2.get())
#输出-------------------------------
2
1

三,优先级队列

优先级队列,第一个值传数字,代表优先级,第二个是值,优先取出的是优先级高的;

q3 = queue.PriorityQueue()
q3.put([4,"666"])
q3.put([3,"54353"])
q3.put([1,"dmfnm"])
print(q3.get())
print(q3.get())
print(q3.get())
#输出---------------------------
[1, 'dmfnm']
[3, '54353']
[4, '666']

四,利用队列和多线程实现生产者消费者模式

q1 = queue.Queue()  #创建一个队列

class Producter(threading.Thread):

    def run(self):
        product = 0
        if q1.qsize() <= 50:
            for i in range (200):
                product += 1
                q1.put("-------------生产---------{}".format(product))
                print("-------------生产---------{}".format(product))
        else:
            time.sleep(1)

class Consumer(threading.Thread):

    def run(self):
        reduce = 0
        if q1.qsize() >= 10:
            for i in range(3):
                reduce += 1
                q1.get()
                print("-------------消费---------{}".format(reduce))
        else:
            time.sleep(2)

th1 = Producter()  #创建1个线程
th1.start()  #启动线程1

for i in range(5):
    c = Consumer()  #创建5个线程
    c.start()  #启动线程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值