queue模块的Queue对象实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,实现了多线程编程所需要的所有锁语义。

Queue对象主要实现了put()和get()方法,分别用来往队列尾部追加元素和在队列头部获取并删除元素。这两个方法都允许指定超时时间,其用法分别为put(item, block=True, timeout=None)和get(block=True, timeout=None)

在下面的代码中,自定义了生产者线程类和消费者线程类,生产者生产随机数量个元素并放置到队列中,消费者则从队列中依次获取其中的元素。

from threading import Thread

from time import sleep

from queue import Queue

from random import randrange

class Producer(Thread):

'''自定义生产者线程类'''

def __init__(self, threadname):

Thread.__init__(self,\

name=threadname)

def run(self):

'''线程运行代码'''

total = randrange(20)

for i in range(total):

# 等待随机时间后往队列中放入一个元素

sleep(randrange(3))

myQueue.put(i)

print(self.getName(),\

' put ', i,\

' to queue.')

# None表示生产者线程结束

myQueue.put(None)

class Consumer(Thread):

def __init__(self, threadname):

Thread.__init__(self,\

name=threadname)

def run(self):

while True:

sleep(randrange(3))

item = myQueue.get()

if item is None:

break

print(self.getName(),\

' get ', item,\

' from queue.')

# 创建队列

myQueue = Queue()

# 创建并启动生产者和消费者线程

Producer('Producer').start()

Consumer('Consumer').start()

第一次运行结果:

Producer  put  0  to queue.

Producer  put  1  to queue.

Producer  put  2  to queue.

Producer  put  3  to queue.

Producer  put  4  to queue.

Consumer  get  0  from queue.

Producer  put  5  to queue.

Consumer  get  1  from queue.

Consumer  get  2  from queue.

Producer  put  6  to queue.

Producer  put  7  to queue.

Consumer  get  3  from queue.

Consumer  get  4  from queue.

Consumer  get  5  from queue.

Consumer  get  6  from queue.

Consumer  get  7  from queue.

第二次运行结果:

Producer  put  0  to queue.

Consumer  get  0  from queue.

Producer  put  1  to queue.

Consumer  get  1  from queue.

Producer  put  2  to queue.

Consumer  get  2  from queue.

Producer  put  3  to queue.

Consumer  get  3  from queue.

Producer  put  4  to queue.

Producer  put  5  to queue.

Consumer  get  4  from queue.

Consumer  get  5  from queue.

Producer  put  6  to queue.

Consumer  get  6  from queue.

Producer  put  7  to queue.

Consumer  get  7  from queue.

Producer  put  8  to queue.

Producer  put  9  to queue.

Consumer  get  8  from queue.

Consumer  get  9  from queue.

Producer  put  10  to queue.

Consumer  get  10  from queue.

Producer  put  11  to queue.

Consumer  get  11  from queue.

Python使用Queue对象实现多线程同步小案例相关推荐

  1. 微课|Python使用Barrier对象实现多线程同步

    中国大学MOOC"Python程序设计基础"第5次开课 推荐教材: <Python网络程序设计(微课版)>,ISBN:978-7-3025-8312-7,董付国,清华大 ...

  2. Python使用Condition对象实现多线程同步

    使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步.在内部实现上,Condition对象总是与某种锁对象相关联. Co ...

  3. Python并行编程(四):多线程同步之condition(条件变量)实现带有缓冲区的生产者-消费者模型...

    什么是Condtion? 所谓condition条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据. 这种同步机制就是一个线程等待特定的条件,另一个线程通知它条件已经发生.一旦条件发 ...

  4. python 修改模板对象的属性_django小技巧之html模板中调用对象属性或对象的方法...

    环境:依赖最初test2数据库 python3版本 多python版本环境 进入,python3虚拟环境,新建项目test4: ]# cd py3/django-test1/ ]# django-ad ...

  5. Python使用BoundedSemaphore对象进行线程同步

    Semaphore对象维护着一个内部计数器,调用acquire()方法时该计数器减1,调用release()方法时该计数器加1,适用于需要控制特定资源的并发访问线程数量的场合. 调用acquire() ...

  6. Python+KNN算法判断单词相似度小案例

    本文代码用于判断待测单词与哪个候选单词最接近,判断标准为字母出现频次(直方图)最接近,只考虑了不小心的拼写错误,而没有考虑故意的拼写错误,例如故意把god写成dog,这可能会造成误判.当然误判率与判断 ...

  7. python爬取网页教程(一个小案例分享)

    一.为什么需要用爬虫? 为其他程序提供数据源,如搜索引擎(百度.Google等).数据分析.大数据等等. 二.python爬虫设计思路 1.首先确定需要爬取的网页URL地址 : 2.通过HTTP协议来 ...

  8. 〖Python零基础入门篇(64)〗- 小案例 - 猜拳游戏与数字猜猜猜

    订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...

  9. python递归详解+汉诺塔小案例_汉诺塔,python递归实现解法步骤

    def hanoi(n,x,y,z):#函数实现n个盘子在x,y,z,移动 if n==1: print(x, ' --> ', z) else: hanoi(n-1,x,z,y)#将n-1层个 ...

最新文章

  1. 如何解决http封包中gzip编码的html
  2. 安全绳使用方法图解_电暖器的使用方法与安全注意事项
  3. Arduino编程之Serial.println()和Serial.print()
  4. Apache Kylin v2.6.1 发布,开源的分布式分析引擎
  5. VS代码提示不出现或者提示变成英文或者各种奇葩问题的解决
  6. AI理论知识整理(6)-最大似然法
  7. caffe 加入 cudnn编译
  8. 汇编的艺术(01)sizeof operator
  9. HTML——初识html,元素 属性 段落 文本格式化 链接 头部入门
  10. 数据结构之线性表的基本C语言语法
  11. 前端 鼠标一次移动半个像素_Web前端(二):CSS3
  12. 一位计算机牛人的心得,谈计算机和数学
  13. Android直播开发之旅(14):使用RC4算法加解密音视频流
  14. [cf] Deltix Round, Autumn 2021 A. Divide and Multiply
  15. 如何一步步打造完美的成绩查询系统平台?
  16. ArcGIS 矢量数据的空间校正和橡皮页变换
  17. 幂级数和函数经典例题_10函数项级数和幂级数 习题课
  18. 1758: [Wc2010]重建计划(TLE)
  19. 【Unity VR开发】结合VRTK4.0:创建滑块
  20. 「动画演示」勾股定理的证明

热门文章

  1. index.php后有乱码后缀,phpExcel在线下wamp环境下,正常导出,同样的代码到线上Linux导出文件无法打开,修改文件后缀为.xls后乱码...
  2. 禁用任何未使用的端口com_CentOS7 - 使用Fail2ban保护SSH
  3. 信息技术计算机网络课堂实录,信息技术教案:计算机网络简介
  4. java camel swagger,Swagger将下划线转换为camelcase
  5. php保存emoji表情,php保存emoji表情
  6. coco训练集darknet_YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
  7. 玩转 SpringBoot 2 之发送邮件篇
  8. 基于JAVA+SpringMVC+Mybatis+MYSQL的课堂考勤系统
  9. 基于JAVA+Servlet+JSP+MYSQL的网上心理咨询系统
  10. LeetCode 662. Maximum Width of Binary Tree