Python使用Queue对象实现多线程同步小案例
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对象实现多线程同步小案例相关推荐
- 微课|Python使用Barrier对象实现多线程同步
中国大学MOOC"Python程序设计基础"第5次开课 推荐教材: <Python网络程序设计(微课版)>,ISBN:978-7-3025-8312-7,董付国,清华大 ...
- Python使用Condition对象实现多线程同步
使用Condition对象可以在某些事件触发后才处理数据或执行特定的功能代码,可以用于不同线程之间的通信或通知,以实现更高级别的同步.在内部实现上,Condition对象总是与某种锁对象相关联. Co ...
- Python并行编程(四):多线程同步之condition(条件变量)实现带有缓冲区的生产者-消费者模型...
什么是Condtion? 所谓condition条件变量,即这种机制是在满足了特定的条件后,线程才可以访问相关的数据. 这种同步机制就是一个线程等待特定的条件,另一个线程通知它条件已经发生.一旦条件发 ...
- python 修改模板对象的属性_django小技巧之html模板中调用对象属性或对象的方法...
环境:依赖最初test2数据库 python3版本 多python版本环境 进入,python3虚拟环境,新建项目test4: ]# cd py3/django-test1/ ]# django-ad ...
- Python使用BoundedSemaphore对象进行线程同步
Semaphore对象维护着一个内部计数器,调用acquire()方法时该计数器减1,调用release()方法时该计数器加1,适用于需要控制特定资源的并发访问线程数量的场合. 调用acquire() ...
- Python+KNN算法判断单词相似度小案例
本文代码用于判断待测单词与哪个候选单词最接近,判断标准为字母出现频次(直方图)最接近,只考虑了不小心的拼写错误,而没有考虑故意的拼写错误,例如故意把god写成dog,这可能会造成误判.当然误判率与判断 ...
- python爬取网页教程(一个小案例分享)
一.为什么需要用爬虫? 为其他程序提供数据源,如搜索引擎(百度.Google等).数据分析.大数据等等. 二.python爬虫设计思路 1.首先确定需要爬取的网页URL地址 : 2.通过HTTP协议来 ...
- 〖Python零基础入门篇(64)〗- 小案例 - 猜拳游戏与数字猜猜猜
订阅 Python全栈白宝书-零基础入门篇 可报销!白嫖入口-请点击我.推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏,免费阶段订阅数量43 ...
- 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层个 ...
最新文章
- 如何解决http封包中gzip编码的html
- 安全绳使用方法图解_电暖器的使用方法与安全注意事项
- Arduino编程之Serial.println()和Serial.print()
- Apache Kylin v2.6.1 发布,开源的分布式分析引擎
- VS代码提示不出现或者提示变成英文或者各种奇葩问题的解决
- AI理论知识整理(6)-最大似然法
- caffe 加入 cudnn编译
- 汇编的艺术(01)sizeof operator
- HTML——初识html,元素 属性 段落 文本格式化 链接 头部入门
- 数据结构之线性表的基本C语言语法
- 前端 鼠标一次移动半个像素_Web前端(二):CSS3
- 一位计算机牛人的心得,谈计算机和数学
- Android直播开发之旅(14):使用RC4算法加解密音视频流
- [cf] Deltix Round, Autumn 2021 A. Divide and Multiply
- 如何一步步打造完美的成绩查询系统平台?
- ArcGIS 矢量数据的空间校正和橡皮页变换
- 幂级数和函数经典例题_10函数项级数和幂级数 习题课
- 1758: [Wc2010]重建计划(TLE)
- 【Unity VR开发】结合VRTK4.0:创建滑块
- 「动画演示」勾股定理的证明
热门文章
- index.php后有乱码后缀,phpExcel在线下wamp环境下,正常导出,同样的代码到线上Linux导出文件无法打开,修改文件后缀为.xls后乱码...
- 禁用任何未使用的端口com_CentOS7 - 使用Fail2ban保护SSH
- 信息技术计算机网络课堂实录,信息技术教案:计算机网络简介
- java camel swagger,Swagger将下划线转换为camelcase
- php保存emoji表情,php保存emoji表情
- coco训练集darknet_YOLOv4: Darknet 如何于 Docker 编译,及训练 COCO 子集
- 玩转 SpringBoot 2 之发送邮件篇
- 基于JAVA+SpringMVC+Mybatis+MYSQL的课堂考勤系统
- 基于JAVA+Servlet+JSP+MYSQL的网上心理咨询系统
- LeetCode 662. Maximum Width of Binary Tree