首页 > 编程语言 >python-Queue队列

python-Queue队列

时间:2023-05-08 18:57:37浏览次数:29  
标签:queue get python put Queue 队列 print

队列Queue

提供同步的、线程安全的队列类, 可以用于线程之间的线程通信。

queue模块实现了多生产者、多消费者队列。这特别适用于消息必须安全地在多线程交换的线程编程。

该模块实现了三种类型的队列,它们的区别是任务取回的顺序。在FIFO队列中,先添加任务的先取回。在LIFO队列中,最后添加的任务先取回(该操作类似于堆栈)。在优先级队列中,条目将保持排序(使用heapq模块)并且最小值的任务第一个返回。

Queue(maxsize=0)

先进后出队列
常用方法

  • Queue.qsize() 返回队列的大小

  • Queue.empty() 如果队列为空,返回True,反之False

  • Queue.full() 是否满,如果满了返回True,反之False,Queue.fullmaxsize 大小对应

  • Queue.get([block[, timeout]]) 获取队列数据,没有数据会进行阻塞,timeout等待时间

  • Queue.get_nowait() 相当于Queue.get(False),非阻塞方法

  • Queue.put(item) 写入队列,timeout等待时间

  • Queue.task_done() 在完成一项工作之后,Queue.task_done()函数向任务已经完成的队列发送一个信号。每个get()调用得到一个任务,接下来task_done()调用告诉队列该任务已经处理完毕。

  • Queue.join() 阻塞调用,直至队列数据为空,才进行下一步执行

Queue队列中的join()和task_done()是配合使用的,。tase_done()的作用:只有消费者把队列所有的数据处理完毕,queue.join()才会停止阻塞

import queue

q = queue.Queue()
q.put(1)
q.put(2)
q.put(3)

print(q.get())
print(q.get())
print(q.get())

1
2
3
import queue
q = queue.Queue(maxsize=5)

q.put(1)
q.put(2)
q.put(3)
q.put(4)
q.put(5)
print(q.full())

True

LifoQueue

后进先出队列 -栈

import queue

q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)

print(q.get())
print(q.get())
print(q.get())

3
2
1

PriorityQueue

优先级队列

数据可以设置优先级,同优先级的按照 ASCII 排序

import queue

q = queue.PriorityQueue()
q.put((2, '2'))
q.put((1, 'a'))
q.put((3, '3'))
q.put((1, '1'))

print(q.get())
print(q.get())
print(q.get())
print(q.get())

(1, '1')
(1, 'a')
(2, '2')
(3, '3')

线程通信

from threading import Thread
import  queue

q = queue.Queue()

def worker():
    while True:
        item = q.get()
        print(f'Working on {item}')
        print(f'Finished {item}')
        q.task_done()

# turn-on the worker thread
Thread(target=worker, daemon=True).start()   #  daemon=True 守护进程,主进程结束,子进程也结束

# send thirty task requests to the worker
for item in range(5):
    q.put(item)
print('All task requests sent >>>')

# block until all tasks are done
q.join()  # 阻塞,直到队列处理结束
print('All work completed')
All task requests sent >>>
Working on 0
Finished 0
Working on 1
Finished 1
Working on 2
Finished 2
Working on 3
Finished 3
Working on 4
Finished 4
All work completed

总结

from queue import Queue,LifoQueue,PriorityQueue
#先进先出队列
q=Queue(maxsize=5)
#后进先出队列
lq=LifoQueue(maxsize=5)
#优先级队列
pq=PriorityQueue(maxsize=5)

for i in range(5):
    q.put(i)
    lq.put(i)
    pq.put(i)

print ("先进先出队列{};是否为空{}多大{};是否满{}".format(q.queue,q.empty(),q.qsize(),q.full()))
print ("先进后出队列{};是否为空{}多大{};是否满{}".format(lq.queue,lq.empty(),lq.qsize(),lq.full()))
print ("优先级队列{};是否为空{}多大{};是否满{}".format(pq.queue,pq.empty(),pq.qsize(),pq.full()))

print (q.get(),lq.get(),pq.get())

print ("先进先出队列{};是否为空{}多大{};是否满{}".format(q.queue,q.empty(),q.qsize(),q.full()))
print ("先进后出队列{};是否为空{}多大{};是否满{}".format(lq.queue,lq.empty(),lq.qsize(),lq.full()))
print ("优先级队列{};是否为空{}多大{};是否满{}".format(pq.queue,pq.empty(),pq.qsize(),pq.full()))

# 先进先出队列deque([0, 1, 2, 3, 4]);是否为空False多大5;是否满True
# 先进先出队列[0, 1, 2, 3, 4];是否为空False多大5;是否满True
# 先进先出队列[0, 1, 2, 3, 4];是否为空False多大5;是否满True
# 0 4 0
# 先进先出队列deque([1, 2, 3, 4]);是否为空False多大4;是否满False
# 先进先出队列[0, 1, 2, 3];是否为空False多大4;是否满False
# 先进先出队列[1, 3, 2, 4];是否为空False多大4;是否满False

标签:queue,get,python,put,Queue,队列,print
From: https://www.cnblogs.com/tian777/p/17382824.html

相关文章

  • 时间序列的STL分解Python代码——以验潮站数据为例
    1.时间序列分解的作用和意义时间序列通常包括如下几种成分:一个时间序列包含三种影响因素: 长期趋势:在一个相当长的时间内表现为一种近似直线的持续向上、向下或平稳的趋势。季节变动:受季节变化影响所形成的一种长度和幅度固定的短期周期波动周期变动:与季节变动类似,但是波动......
  • python-手动借助google翻译来翻译文档
    1importos2importre3'''4读取指定的html文件5去掉所有的换行符6正则匹配特定项目:(?<=<divclass="block">).+?(?=</div>)7然后替换掉:</code>|<code>|<i>|</i>==>""8......
  • Python基础面试题
    1、Python和Java、PHP、C、C#、C++等其他语言的对比?'''1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言。C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素。C++在这方面做了改进,在保留了指针操作的同时又增强......
  • Python面向对象面试题
    1、简述面向对象的三大特性。#答案封装: 封装指的是把一堆数据属性与方法数据放在一个容器中,这个容器就是对象。让对象可以通过"."来调用对象中的数据属性与方法属性。继承: 继承指的是子类可以继承父类的数据属性与方法属性,并可以对其进行修改或使用。多......
  • Python网络并发面试题
    1、python的底层网络交互模块有哪些?#答案:'''socket,urllib,urllib3,requests,grab,pycurl'''2、简述OSI七层协议。#答案:'''应用层:HTTP,FTP,NFS表示层:Telnet,SNMP会话层:SMTP,DNS传输层:TCP,UDP网络层:IP,ICMP,ARP,数据链路层:Ethernet,PP......
  • Python模块面试题
    1.列举常用的模块。基础:os,sys,time,datetime,json,pickle,randon,hashlib,re,math,logging爬虫:requests,BeautifulSoup,xpath,gevent,asyncio,twisted数据分析:pandas,numpy,scipy,matplotlib,seaborn等。。。2.如何安装第三方模块?pip3install模块名称3.re的ma......
  • Python设计模式面试题
    单例模式1请手写一个单例#encoding=utf8importthreadingimporttime#这里使用方法__new__来实现单例模式classSingleton(object):#抽象单例def__new__(cls,*args,**kw):ifnothasattr(cls,'_instance'):orig=super(Singleton,cls)......
  • python selenium 元素定位方法
    1.通过元素的id属性进行元素定位,在html中元素的id是唯一的定位方法:find_element_by_id(id)fromseleniumimportwebdriver#创建WebDriver对象,指明使用chrome浏览器驱动wd=webdriver.Chrome()#调用WebDriver对象的get方法可以让浏览器打开指定网址wd.get('ht......
  • python 打包
    1,单文件打包pyinstaller-F-wfile.py-F:-w::启动exe文件,不显示控制台2,多文件打包 文件结构:testmain.pyset.py如果使用:pyinstaller-F-wmain.py发生问题:相互依赖的文件,打包后无法引用,导致报错可以使用:pyinstaller-Dmain.py-pset.py假......
  • Python绘制雷达图
    基本步骤创建一个axe对象,创建时设置参数polar为True以使用极坐标系绘制图像示例代码frommatplotlibimportpyplotaspltax=plt.subplot(111,polar=True)#设置绘制极坐标xs=['a','b','c','d','e','a']ys=[1,2,4,3,1,1......