queue 模块下提供了几个阻塞队列,这些队列主要用于实现线程通信。在 queue 模块下主要提供了三个类,分别代表三种队列,它们的主要区别就在于进队列、出队列的不同。

关于这三个队列类的简单介绍如下:

  1. queue.Queue(maxsize=0):代表 FIFO(先进先出)的常规队列,maxsize 可以限制队列的大小。如果队列的大小达到队列的上限,就会加锁,再次加入元素时就会被阻塞,直到队列中的元素被消费。如果将 maxsize 设置为 0 或负数,则该队列的大小就是无限制的。
  2. queue.LifoQueue(maxsize=0):代表 LIFO(后进先出)的队列,与 Queue 的区别就是出队列的顺序不同。
  3. 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相关推荐

  1. udp多线程 java_UDP实现多线程通信

    UDP实现多线程通信 //接收进程 import java.io.IOException; import java.net.DatagramPacket; import java.net.Datagr ...

  2. java通信项目_Java项目中的多线程通信如何利用Socket实现

    Java项目中的多线程通信如何利用Socket实现 发布时间:2020-11-24 16:44:40 来源:亿速云 阅读:96 作者:Leah 这期内容当中小编将会给大家带来有关Java项目中的多线程 ...

  3. python多进程间通信_Python 多进程编程之 进程间的通信(Queue)

    Python 多进程编程之 进程间的通信(Queue) 1,进程间通信 Process有时是需要通信的,操作系统提供了很多机制来实现进程之间的通信,而Queue就是其中的一个方法 ----这是操作系统 ...

  4. linux下串口多线程通信 ,多串口收发数据错乱问题解决办法

    最近在写AM335x平台的串口测试工具,最开始的时候写的第一版本,测试一直很ok,但是存在一些缺陷,于是就想改进一下,没想到后面在新的板子测试,竟然发现了以个很致命的问题,在旧系统旧内核测试一切正常, ...

  5. java程序假死_分析一个常见的java多线程通信问题(假死现象)

    一件复杂的事,一个人如果不能做,两个人又做的不好,一群人就可能很好的解决了.对于线程来说也是,通过多个线程就能完成一个更复杂的功能,这就需要多个线程协作,协作就需要交流,但是交流总是会出问题的.在这篇 ...

  6. 母鸡下蛋实例:多线程通信生产者和消费者wait/notify和condition/await/signal条件队列

    目录 简介 一对一生产和消费:一只母鸡和叫练 wait/notify Lock条件队列 多对多生产和消费:2只母鸡和叫练/叫练媳妇 wait/notifyAll Lock条件队列 Lock和synch ...

  7. python3 queue的多线程通信

    queue分类 python3 queue分三类: 先进先出队列 后进先出的栈 优先级队列 他们的导入方式分别是: from queue import Queue from queue import ...

  8. 多进程与多线程通信同步机制

    多进程通信方式 管道pipe:管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系. 命名管道FIFO:有名管道也是半双工的通信方式,但 ...

  9. 计算机网络多线程通信,多线程技术的PLC与PC的通讯方式

    基于多线程技术的PLC与PC的通讯方式 1.系统构成 推进系统中,PC机选用工控计算机.它是整个控制系统的核心,是上位机.其主要利用良好的图形用户界面,显示从PLC接收的开关量和控制手柄的位置,进行一 ...

  10. 多线程通信—生产者和消费者模式

    1.队列Queue: 从一个线程向另一个线程发送数据最安全的方式可能就是使用queue库中的队列了.创建一个被多个线程共享的Queue对象,这些线程通过使用put()和get()操作来向队列中添加或者 ...

最新文章

  1. 应用按home键无最近应用
  2. Qt webkitwidgets模块和webenginewidgets模块
  3. 开源——需要分享共享的无私精神
  4. VB.NET开发人员必备参考10本书目
  5. 遵循五大设计理念 打造出色设计师
  6. linux时间格式化命令
  7. 时间操作(JavaScript版)—页面显示格式:年月日 时分秒 星期
  8. pyboard :红外遥控模块,class UART
  9. PHP、TP5生成下载word
  10. java 视频边下边播,VideoViewDemo android 播放器,支持边下边播 238万源代码下载- www.pudn.com...
  11. 那些让我印象深刻的bug--02
  12. 继续分享最新版本的autohotkey自己编写的快捷键
  13. 如何删除Win10“此电脑”中多出的“CD驱动器”盘符
  14. 用故事解析setTimeout和setInterval(内含js单线程和任务队列)
  15. 香港主机CDN加速,让您的网站速度飙升
  16. CSDN文章如何迁移至微信公众号
  17. 著名的海龟式期货交易系统完整版来了!值得收藏!
  18. Altium 常用快捷键
  19. JavaScript的判断语句
  20. 吐槽一下,英伟达Nvidia官网下载驱动及相关资源,下载完全是打不开的文件

热门文章

  1. Python 爬取微信朋友圈的方法
  2. matlab画出鸢尾花数据集散点图尾花,鸢尾花数据集分以及绘制散点矩阵图
  3. Codeforces 417D.Cunning Gena (状压DP)
  4. mac80端口问题无法使用
  5. JAVA计算机毕业设计校园闲置物品信息管理系统Mybatis+源码+数据库+lw文档+系统+调试部署
  6. Android桌面图标快捷方式
  7. adb 重命名_adb 常用命令-转载
  8. android常用adb命令大全,Android ADB常用命令总结
  9. 技巧分享:简单的流程图怎么作?
  10. 阿里巴巴icon font导入CSS