Python模块-queue队列模块

陌路散爱 提交于 2021-01-05 01:21:10

队列方法

q = queue.Queue().put()

队列方法 释义
q.put() 存数据
q.get() 获取队列
q.qsize() 队列大小
q.empty() 判断队列是否为空,为空返回True
q.full() 判断队列是否已满,已满返回True
q.put_nowait() 相当于q.put(block=Flase)
q.get_nowait() 相当于q.get(block=Flase)
q.task_done() 在完成一项工作后,q.task_done向任务已完成队列发送信号
q.join() 等待队列,接收q.task_done发送的信号

队列优先级

queue.Queue()

先进先出

# -*- coding:utf-8 -*-
import queue
q = queue.Queue(3)               #创建一个空队列   【先进先出】
q.put(1)                         #往队列中添加值
q.put(2)
q.put(3)
while 1:
    data = q.get()
    print(data)
1
2
3

queue.LifoQueue()

先进后出

# -*- coding:utf-8 -*-
import queue
q = queue.LifoQueue(3)           #创建一个空队列   【先进后出】
q.put(1)                         #往队列中添加值
q.put(2)
q.put(3)
while 1:
    data = q.get()
    print(data)
321

queue.PriorityQueue()

定级队列

# -*- coding:utf-8 -*-
import queue
q = queue.PriorityQueue(3)           #创建一个空队列   【定级队列】
q.put([2,"hello"])                   #往队列中添加值
q.put([1,"你好"])
q.put([3,"hi"])

while 1:
    data = q.get()
    print(data[1])
你好
hello
hi

多线程队列

# -*- coding:utf-8 -*-
from threading import Thread
import queue

def f(q,n):
    q.put(n * n + 1)                                            #存数据到队列中
    print("队列新增数据内存地址:",id(q))                       #打印对象内存地址
if __name__ == "__main__":
    q = queue.Queue()                                           #实例化线程队列
    print("队列内存地址:",id(q))                               #打印对象内存地址
    for i in range(3):                                          #for循环调用
        p = Thread(target=f,args=(q,i))                         #建立线程,值通过args传值
        p.start()                                               #启用线程
    print(q.get())                                              #拿队列中的值
    print(q.get())
    print(q.get())
队列内存地址: 2641998861088
队列新增数据内存地址: 2641998861088
队列新增数据内存地址: 2641998861088
队列新增数据内存地址: 2641998861088
1
2
5

多进程队列

# -*- coding:utf-8 -*-
from multiprocessing import Process,Queue

def f(q,n):
    q.put(n * n + 1)                            #存数据到队列中
    print("队列新增数据内存地址:",id(q))       #打印对象内存地址
if __name__ == "__main__":
    q = Queue()                                 #实例化进程队列
    print("队列内存地址:",id(q))               #打印对象内存地址
    for i in range(3):                          #for循环调用
        p = Process(target=f,args=(q,i))        #建立进程,值通过args传值
        p.start()                               #启用进程
    print(q.get())                              #拿队列中的值
    print(q.get())
    print(q.get())
队列内存地址: 1858644890400
队列新增数据内存地址: 2587420171064
1
队列新增数据内存地址: 2744677276528
2
队列新增数据内存地址: 2763448032056
5

生产消费者模型

# -*- coding:utf-8 -*-
import time,random
import queue,threading

q = queue.Queue()
def Producer(name):
    count = 0                                                       #初始化值(生产数量)
    while count < 10:                                               #指定生产数量
        print("生产中...")
        time.sleep(10)                                              #随机时间用于测试
        count += 2                                                  #生产数值
        q.put(count)                                                #添加数值到队列
        q.task_done()                                               #向队列发送消息
        print("%s生产%s个包子" %(name,count))
    print ("今天的包子卖完了!")

def Consumer(name):
    count = 0                                                       #初始化值(消费数量)
    while count < 10:                                               #指定消费数量
        time.sleep(random.randrange(4))                             #随机时间用于测试
        # if not q.empty():                                         #判断队列中是否有数值
        q.join()
        count += 1                                                  #消费数值
        data = q.get(count)                                         #从队列中拿取数值
        q.join()                                                    #等待其他线程(等待包子制作完成)
        print("%s买走了%s了" %(name,data))


p1 = threading.Thread(target=Producer,args=('厨师',))                #生产者
c1 = threading.Thread(target=Consumer,args=('客人-小明',))           #消费者
c2 = threading.Thread(target=Consumer,args=('客人-小王',))           #消费者
p1.start()
c1.start()
c2.start()
生产中...
厨师生产2个包子
生产中...
客人-小明买走了2了
厨师生产4个包子
生产中...
客人-小王买走了4了
厨师生产6个包子
生产中...
客人-小明买走了6了
厨师生产8个包子
生产中...
客人-小王买走了8了
厨师生产10个包子
客人-小明买走了10了
今天的包子卖完了!
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!