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类的基础入门知识
Nov 24 Python
跟老齐学Python之类的细节
Oct 13 Python
Python实现字符串格式化的方法小结
Feb 20 Python
python类的方法属性与方法属性的动态绑定代码详解
Dec 27 Python
python处理multipart/form-data的请求方法
Dec 26 Python
这可能是最好玩的python GUI入门实例(推荐)
Jul 19 Python
Flask框架学习笔记之使用Flask实现表单开发详解
Aug 12 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
Python谱减法语音降噪实例
Dec 18 Python
python用pip install时安装失败的一系列问题及解决方法
Feb 24 Python
django自带的权限管理Permission用法说明
May 13 Python
Python 全局空间和局部空间
Apr 06 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
PHP 反射机制实现动态代理的代码
2008/10/22 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
php头像上传预览实例代码
2017/05/02 PHP
Yii2使用表单上传文件的实例代码
2017/08/03 PHP
php设计模式之策略模式应用案例详解
2019/06/17 PHP
使用dynatrace-ajax跟踪JavaScript的性能
2010/04/12 Javascript
Android中资源文件(非代码部分)的使用概览
2012/12/18 Javascript
指定区域的图片自动按比例缩小的js代码(防止页面被图片撑破)
2014/02/21 Javascript
使用js画图之饼图
2015/01/12 Javascript
jquery实现漫天雪花飞舞的圣诞祝福雪花效果代码分享
2015/08/20 Javascript
BootStrap表单宽度设置方法
2017/03/10 Javascript
Angular.js项目中使用gulp实现自动化构建以及压缩打包详解
2017/07/19 Javascript
jquery实现限制textarea输入字数的方法
2017/09/06 jQuery
select获取下拉框的值 下拉框默认选中方法
2018/02/28 Javascript
Vue页面骨架屏的实现方法
2018/05/22 Javascript
vue 项目接口管理的实现
2019/01/17 Javascript
JS前端知识点 运算符优先级,URL编码与解码,String,Math,arguments操作整理总结
2019/06/27 Javascript
angularjs1.X 重构controller 的方法小结
2019/08/15 Javascript
js实现html滑动图片拼图验证
2020/06/24 Javascript
js面向对象封装级联下拉菜单列表的实现步骤
2021/02/08 Javascript
举例详解Python中threading模块的几个常用方法
2015/06/18 Python
举例讲解Python面相对象编程中对象的属性与类的方法
2016/01/19 Python
破解安装Pycharm的方法
2018/10/19 Python
python基于itchat模块实现微信防撤回
2019/04/29 Python
Python 字节流,字符串,十六进制相互转换实例(binascii,bytes)
2020/05/11 Python
材料加工硕士生求职信
2013/10/10 职场文书
个性大学生自我评价
2013/12/04 职场文书
理工科学生的自我评价
2013/12/15 职场文书
演讲稿怎么写
2014/01/07 职场文书
优秀学生事迹材料
2014/02/08 职场文书
超市理货员岗位职责
2014/07/04 职场文书
信用卡工资证明范本
2014/10/17 职场文书
2014年保洁员工作总结
2014/11/19 职场文书
2015年优质护理服务工作总结
2015/04/08 职场文书
Vue过滤器(filter)实现及应用场景详解
2021/06/15 Vue.js
一文了解Java动态代理的原理及实现
2022/07/07 Java/Android