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. LIVE 预告 | CMU研究者:解放审稿人,AI可以帮我们实现自动审稿吗?
  2. BestCoder Round #80 1002
  3. Qt学习(九):QT中使用线程
  4. static_cast, dynamic_cast, const_cast探讨【转】
  5. 解决scrollViewDidScroll do not work的方法
  6. 从XaaS到Java EE – 2012年哪一种该死的云最适合我?
  7. Android 实现选中与非选中样式效果
  8. 基于 arm 设计开发工具包的 Arm Cortex-M3 处理器的示例系统级设计(第一章:文件目录AHB组件开发平台)
  9. UGUI的image
  10. latex中的对与错(对号与叉号)
  11. 行式 Excel 文件去重
  12. matlab里数据类型转换,Matlab数据类型及转换
  13. 旧梦一场用计算机怎么表示,歌曲旧梦一场表达什么意思?
  14. 浙江省乡村快递寄件数据分析-快递100百递指数
  15. PAT(乙级) 1045 快速排序
  16. 切线法(牛顿法)、割线法、抛物线法
  17. 年度大促将至,企业如何进行性能压测
  18. 触控板失灵的解决方法(synaptics驱动)
  19. kindeditor 自定义上传图片
  20. 我的markdown临时图片区(for 印象笔记web)

热门文章

  1. 用H5新特性canvas绘制一个钟表
  2. AlphaTest烘焙的阴影不正确
  3. xpath兄弟结点语法
  4. mysql group by 用法解析
  5. Mqtt Retained Message(保留消息)
  6. unite 2019 上海,东京,首尔,哥本哈根,悉尼 的视频/资料
  7. 爬虫 (6)- Scrapy 实战案例 - 爬取不锈钢的相关钢卷信息
  8. 大一新生调查报告——新生遇到的问题与需求
  9. 六西格玛dfss_六西格玛设计DFSS.pdf
  10. Android 十大布局