找回密码
 会员注册
查看: 33|回复: 0

学习心得Python中的queue模块使用

[复制链接]

4

主题

0

回帖

13

积分

新手上路

积分
13
发表于 2024-9-11 17:35:13 | 显示全部楼层 |阅读模式
一、Queue模块的知识点思维导图二、Queue模块常用函数介绍queue模块是内置的,不需要安装直接导入就可以了。(1)创建一个Queue对象importqueue#创建一个队列实例q=queue.Queue(maxsize=20)#可选参数,默认为无限大'运行运行(2)入队#导入Python标准库中的queue模块,该模块提供了线程安全的队列数据结构importqueue#创建一个Queue对象,可以理解为初始化一个队列,参数maxsize默认为0,表示队列大小无限制q=queue.Queue()#使用for循环将数字0到9依次放入队列中#put方法用于将元素放入队列尾部,即执行入队操作foriinrange(10):q.put(i)#这里每执行一次,就将i(0-9)作为一个元素放入队列中#此时,队列q中按照先进先出(FIFO)原则存储了数字0-9'运行运行(3)出队#导入Python内置的queue模块,其中包含线程安全的队列数据结构importqueue#创建一个Queue对象,即初始化一个空队列q=queue.Queue()#使用for循环将0到9这10个整数依次入队#put方法将元素添加到队列的末尾foriinrange(10):q.put(i)#每次循环都将i作为元素放入队列中#此时q中已有元素,下面开始出队#出队的三种方式q.get()q.get_nowait()q.get(block=False)#和get_nowait()一样功能#循环出队foriinrange(q.qsize()):print(q.get())'运行运行(4)判空#导入Python内置的queue模块,其中包含线程安全的队列数据结构importqueue#创建一个Queue对象,即初始化一个空队列q=queue.Queue()#使用for循环将0到9这10个整数依次入队#put方法将元素添加到队列的末尾foriinrange(10):q.put(i)#每次循环都将i作为元素放入队列中#使用while循环检查队列是否为空#当队列不为空时,持续执行循环体内的操作whilenotq.empty():#使用get方法从队列中取出并移除一个元素#默认情况下,get方法会阻塞直到有元素可用(除非设置了非阻塞模式)data=q.get()#打印从队列中取出的元素print(data)#当队列为空时,while循环结束#此时所有之前入队的整数0-9会被按照先进先出(FIFO)的原则依次出队并打印'运行运行(5)判满importqueue#初始化一个容量为5的队列q=queue.Queue(maxsize=5)#入队操作foriinrange(10):#在入队前检查队列是否已满ifq.full():print("Queueisfull,cannotinsertmoreitems.")else:q.put(i)#若队列已满,可以选择等待一段时间后重试或其他处理策略ifq.full():time.sleep(1)#假设休眠一秒后重试continuewhilenotq.empty():data=q.get()print(data)(6)获取队列长度importqueue#创建一个队列q=queue.Queue()#将10个元素放入队列foriinrange(10):q.put(i)#打印队列长度print(f"Queuesizebeforeprocessing:{q.qsize()}")#处理队列中的元素,同时打印队列长度whilenotq.empty():data=q.get()print(f"Processingelement:{data},currentqueuesize:{q.qsize()}")#在处理过程中,每次从队列中取出一个元素后,队列长度都会减一'运行运行(7)task_done()和unfinished_tasksimportqueueimportthreading#创建一个队列q=queue.Queue()#生产者线程将任务放入队列defproducer():foriinrange(10):q.put(i)print(f"Produceraddedtask:{i}")#消费者线程从队列中取出并处理任务defconsumer():whileTrue:task=q.get()#获取任务print(f"Consumerstartedworkingontask:{task}")#这里模拟任务处理过程#实际应用中,此处应替换为实际的任务处理逻辑process_task(task)#任务处理完毕,调用task_done()q.task_done()print(f"Consumerfinishedtask:{task}")#检查队列是否为空且所有任务都已经完成ifq.empty()andq.unfinished_tasks==0:print("Alltaskscompleted,exitingconsumer.")break#创建并启动生产者线程p=threading.Thread(target=producer)p.start()p.join()#确保生产者线程完成任务#创建并启动消费者线程c=threading.Thread(target=consumer)c.start()c.join()#等待消费者线程处理完所有任务并退出#由于消费者线程在所有任务完成后退出,所以在此处不需要再次检查队列状态'运行运行(8)joinimportqueueimportthreading#创建一个队列q=queue.Queue()#生产者线程将任务放入队列defproducer():foriinrange(10):q.put(i)print("Producerhasaddedalltasks.")#消费者线程从队列中取出并处理任务defconsumer():whileTrue:task=q.get()#获取任务print(f"Consumerstartedworkingontask:{task}")#这里模拟任务处理过程#实际应用中,此处应替换为实际的任务处理逻辑process_task(task)#任务处理完毕,调用task_done()q.task_done()print(f"Consumerfinishedtask:{task}")#检查队列是否为空ifq.empty():print("Nomoretasksinthequeue.")break#创建并启动生产者线程p=threading.Thread(target=producer)p.start()p.join()#确保生产者线程完成任务添加#创建并启动消费者线程c=threading.Thread(target=consumer)c.start()#主线程等待所有任务完成q.join()#阻塞主线程,直到所有从队列中取出的任务都被标记为完成print("Alltaskshavebeenprocessedandmarkedasdone.")
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-28 23:20 , Processed in 1.558809 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表