多线程通信Queue
queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信。在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列、出队列的不同。
关于这三个队列类的简单介绍如下:
- queue.Queue(maxsize=0):代表 FIFO(先进先出)的常规队列,maxsize 可以限制队列的大小。如果队列的大小达到队列的上限,就会加锁,再次加入元素时就会被阻塞,直到队列中的元素被消费。如果将 maxsize 设置为 0 或负数,则该队列的大小就是无限制的。
- queue.LifoQueue(maxsize=0):代表 LIFO(后进先出)的队列,与 Queue 的区别就是出队列的顺序不同。
- PriorityQueue(maxsize=0):代表优先级队列,优先级最小的元素先出队列。
这三个队列类的属性和方法基本相同, 它们都提供了如下属性和方法:
- Queue.qsize():返回队列的实际大小,也就是该队列中包含几个元素。
- Queue.empty():判断队列是否为空。
- Queue.full():判断队列是否已满。
- Queue.put(item, block=True, timeout=None):向队列中放入元素。如果队列己满,且 block 参数为 True(阻塞),当前线程被阻塞,timeout 指定阻塞时间,如果将 timeout 设置为 None,则代表一直阻塞,直到该队列的元素被消费;如果队列己满,且 block 参数为 False(不阻塞),则直接引发 queue.FULL 异常。
- Queue.put_nowait(item):向队列中放入元素,不阻塞。相当于在上一个方法中将 block 参数设置为 False。
- Queue.get(item, block=True, timeout=None):从队列中取出元素(消费元素)。如果队列已满,且 block 参数为 True(阻塞),当前线程被阻塞,timeout 指定阻塞时间,如果将 timeout 设置为 None,则代表一直阻塞,直到有元素被放入队列中; 如果队列己空,且 block 参数为 False(不阻塞),则直接引发 queue.EMPTY 异常。
- Queue.get_nowait(item):从队列中取出元素,不阻塞。相当于在上一个方法中将 block 参数设置为 False。
import queue # 定义一个长度为2的阻塞队列 bq = queue.Queue(2) bq.put("Python") bq.put("Python") print("1111111111") bq.put("Python") # ① 阻塞线程 print("2222222222")
上面程序先定义了一个大小为 2 的 Queue,程序先向该队列中放入两个元素,此时队列还没有满,两个元素都可以被放入。当程序试图放入第三个元素时,如果使用 put() 方法尝试放入元素将会阻塞线程,如上面程序中 ① 号代码所示。
与此类似的是,在 Queue 已空的情况下,程序使用 get() 方法尝试取出元素将会阻塞线程。
import threadingimport timeimport queuedef product(bq): str_tuple = ("Python", "Kotlin", "Swift") for i in range(100): print(threading.current_thread().name + "生产者准备生产元组元素!") time.sleep(0.2); # 尝试放入元素,如果队列已满,则线程被阻塞 bq.put(str_tuple[i % 3]) print(threading.current_thread().name \ + "生产者生产元组元素完成!")def consume(bq): while True: print(threading.current_thread().name + "消费者准备消费元组元素!") time.sleep(0.2) # 尝试取出元素,如果队列已空,则线程被阻塞 t = bq.get() print(threading.current_thread().name \ + "消费者消费[ %s ]元素完成!" % t)# 创建一个容量为1的Queuebq = queue.Queue(maxsize=1)# 启动3个生产者线程threading.Thread(target=product, args=(bq, ),name="甲").start()threading.Thread(target=product, args=(bq, ),name="乙").start()threading.Thread(target=product, args=(bq, ),name="丙").start()# 启动一个消费者线程threading.Thread(target=consume, args=(bq, ),name="111").start()threading.Thread(target=consume, args=(bq, ),name="112").start()
上面程序启动了三个生产者线程向 Queue 队列中放入元素,启动了两个消费者线程从 Queue 队列中取出元素。本程序中 Queue 队列的大小为 1,因此三个生产者线程无法连续放入元素,必须等待消费者线程取出一个元素后,其中的一个生产者线程才能放入一个元素。所以在生产者生产一个元素之后,消费者必须取出一个元素,生产者生产的元素才能进入队列,否则就会发生阻塞。
三个生产者线程都想向 Queue 中放入元素,但只要其中一个生产者线程向该队列中放入元素之后,其他生产者线程就必须等待,等待消费者线程取出 Queue 队列中的元素。
转载于:https://www.cnblogs.com/jzxs/p/11422358.html
多线程通信Queue相关推荐
- udp多线程 java_UDP实现多线程通信
UDP实现多线程通信 //接收进程 import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagr ...
- java通信项目_Java项目中的多线程通信如何利用Socket实现
Java项目中的多线程通信如何利用Socket实现 发布时间:2020-11-24 16:44:40 来源:亿速云 阅读:96 作者:Leah 这期内容当中小编将会给大家带来有关Java项目中的多线程 ...
- python多进程间通信_Python 多进程编程之 进程间的通信(Queue)
Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...
- linux下串口多线程通信 ,多串口收发数据错乱问题解决办法
最近在写AM335x平台的串口测试工具,最开始的时候写的第一版本,测试一直很ok,但是存在一些缺陷,于是就想改进一下,没想到后面在新的板子测试,竟然发现了以个很致命的问题,在旧系统旧内核测试一切正常, ...
- java程序假死_分析一个常见的java多线程通信问题(假死现象)
一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了.对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的.在这篇 ...
- 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列
目录 简介 一对一生产和消费:一只母鸡和叫练 wait/notify Lock条件队列 多对多生产和消费:2只母鸡和叫练/叫练媳妇 wait/notifyAll Lock条件队列 Lock和synch ...
- python3 queue的多线程通信
queue分类 python3 queue分三类: 先进先出队列 后进先出的栈 优先级队列 他们的导入方式分别是: from queue import Queue from queue import ...
- 多进程与多线程通信同步机制
多进程通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式,但 ...
- 计算机网络多线程通信,多线程技术的PLC与PC的通讯方式
基于多线程技术的PLC与PC的通讯方式 1.系统构成 推进系统中,PC机选用工控计算机.它是整个控制系统的核心,是上位机.其主要利用良好的图形用户界面,显示从PLC接收的开关量和控制手柄的位置,进行一 ...
- 多线程通信—生产者和消费者模式
1.队列Queue: 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者 ...
最新文章
- 应用按home键无最近应用
- Qt webkitwidgets模块和webenginewidgets模块
- 开源——需要分享共享的无私精神
- VB.NET开发人员必备参考10本书目
- 遵循五大设计理念 打造出色设计师
- linux时间格式化命令
- 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
- pyboard :红外遥控模块,class UART
- PHP、TP5生成下载word
- java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...
- 那些让我印象深刻的bug--02
- 继续分享最新版本的autohotkey自己编写的快捷键
- 如何删除Win10“此电脑”中多出的“CD驱动器”盘符
- 用故事解析setTimeout和setInterval(内含js单线程和任务队列)
- 香港主机CDN加速,让您的网站速度飙升
- CSDN文章如何迁移至微信公众号
- 著名的海龟式期货交易系统完整版来了!值得收藏!
- Altium 常用快捷键
- JavaScript的判断语句
- 吐槽一下,英伟达Nvidia官网下载驱动及相关资源,下载完全是打不开的文件
热门文章
- Python 爬取微信朋友圈的方法
- matlab画出鸢尾花数据集散点图尾花,鸢尾花数据集分以及绘制散点矩阵图
- Codeforces 417D.Cunning Gena (状压DP)
- mac80端口问题无法使用
- JAVA计算机毕业设计校园闲置物品信息管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
- Android桌面图标快捷方式
- adb 重命名_adb 常用命令-转载
- android常用adb命令大全,Android ADB常用命令总结
- 技巧分享:简单的流程图怎么作?
- 阿里巴巴icon font导入CSS