Python semaphore evevt生产者消费者模型原理解析


Posted in Python onMarch 18, 2020

线程锁相当于同时只能有一个线程申请锁,有的场景无数据修改互斥要求可以同时让多个线程同时运行,且需要限制并发线程数量时可以使用信号量

import threading, time, queue

def test(name):
  semaphore.acquire() #获取信号量锁
  print('my name is %s' %name)
  time.sleep(1)
  semaphore.release() #释放信号量锁

semaphore = threading.BoundedSemaphore(5) #创建一个信号量同时可以运行3个线程
for i in range(20):
  t = threading.Thread(target=test, args=(i,))
  t.start()
while threading.active_count() == 1:
  print("all run done")

两个或者多个线程需要交互时,且一个进程需要根据另一线程状态执行对应操作时,可以通过event来设置线程状态达到期望的效果,下面是一个红绿灯的例子

event = threading.Event() #实例化一个event
def light():
  while True:
    print("红灯亮了,请停车")
    time.sleep(20) #开始是红灯20s
    event.set() #红灯时间到了,设置标志位
    print("绿灯亮了,请通行")
    time.sleep(30) #持续30s红灯
    event.clear() #清空标志位

def car(num):
  while True:
    if event.is_set():#检测event被设置则执行
      print("car %s run"%num)
      time.sleep(5)
    else:
      print("this is red light waiting")
      event.wait() #此处会卡主,直到状态被设置才会向下执行



Light = threading.Thread(target=light,)
Light.start()
for i in range(10):
  Car = threading.Thread(target=car, args=(i,))
  Car.start()

当多个线程需要交互数据可以使用queue来进行数据传递,下面是经典的生产者消费者多线程模型示例,其中包含线程queue的基本使用方法

my_queue = queue.Queue() #实例化一个队列
queue1 = queue.LifoQueue() #后进 先出队列
queue2 = queue.PriorityQueue() #带优先级的队列
def pro():
  for i in range(100):
    my_queue.put(i) #队列里面放数据
def con():
  while my_queue.qsize() > 0: #当队列有数据时候从队列取数据
    print("i an a consumer,get num %s"%my_queue.get(timeout=3))
    time.sleep(2)
  else:
    print("my queue is empty")

Pro = threading.Thread(target=pro)
Pro.start()


for j in range(10):
  Con = threading.Thread(target=con)
  Con.start()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
研究Python的ORM框架中的SQLAlchemy库的映射关系
Apr 25 Python
Python常用的内置序列结构(列表、元组、字典)学习笔记
Jul 08 Python
python opencv之SURF算法示例
Feb 24 Python
使用Python读取安卓手机的屏幕分辨率方法
Mar 31 Python
django 在原有表格添加或删除字段的实例
May 27 Python
linux下安装python3和对应的pip环境教程详解
Jul 01 Python
python识别文字(基于tesseract)代码实例
Aug 24 Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 Python
python实现程序重启和系统重启方式
Apr 16 Python
python基于selenium爬取斗鱼弹幕
Feb 20 Python
解决PDF 转图片时丢文字的一种可能方式
Mar 04 Python
Python list去重且保持原顺序不变的方法
Apr 03 Python
Python中remove漏删和索引越界问题的解决
Mar 18 #Python
Python集成开发工具Pycharm的安装和使用详解
Mar 18 #Python
Python3监控windows,linux系统的CPU、硬盘、内存使用率和各个端口的开启情况详细代码实例
Mar 18 #Python
PyTorch加载自己的数据集实例详解
Mar 18 #Python
Python进程间通信multiprocess代码实例
Mar 18 #Python
python实现超级玛丽游戏
Mar 18 #Python
python实现超级马里奥
Mar 18 #Python
You might like
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
Swoole实现异步投递task任务案例详解
2019/04/02 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jquery Mobile入门—外部链接切换示例代码
2013/01/08 Javascript
JQuery中根据属性或属性值获得元素(6种情况获取方法)
2013/01/17 Javascript
js中的referrer返回上一页使用介绍
2013/09/26 Javascript
实现网页页面跳转的几种方法(meta标签、js实现、php实现)
2014/05/20 Javascript
使用javascript实现简单的选项卡切换
2015/01/09 Javascript
JavaScript如何调试有哪些建议和技巧附五款有用的调试工具
2015/10/28 Javascript
js数组操作方法总结(必看篇)
2016/11/22 Javascript
js中数组的常用方法小结
2016/12/30 Javascript
jQuery返回定位插件详解
2017/05/15 jQuery
Vue 兄弟组件通信的方法(不使用Vuex)
2017/10/26 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
element-ui树形控件后台返回的数据+生成组织树的工具类
2020/03/05 Javascript
详解用js代码触发dom事件的实现方案
2020/06/10 Javascript
Python常用随机数与随机字符串方法实例
2015/04/09 Python
python 回调函数和回调方法的实现分析
2016/03/23 Python
python 简单的多线程链接实现代码
2016/08/28 Python
python引入导入自定义模块和外部文件的实例
2017/07/24 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
对python实现二维函数高次拟合的示例详解
2018/12/29 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
2019/08/14 Python
python深copy和浅copy区别对比解析
2019/12/26 Python
python制作微博图片爬取工具
2021/01/16 Python
Champs Sports加拿大:北美最大的以商场为基础的专业运动鞋和服装零售商之一
2018/05/01 全球购物
运动会稿件200字
2014/02/07 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
2014年科技工作总结
2014/11/26 职场文书
2015年底工作总结范文
2015/05/15 职场文书
公司考勤管理制度
2015/08/04 职场文书
保险公司2016开门红口号集锦
2015/12/24 职场文书
使用Golang的channel交叉打印两个数组的操作
2021/04/29 Golang
MySQL系列之六 用户与授权
2021/07/02 MySQL
mysql如何查询连续记录
2022/05/11 MySQL