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 元类使用说明
Dec 18 Python
windows下python之mysqldb模块安装方法
Sep 07 Python
Python程序员面试题 你必须提前准备!
Jan 16 Python
python与字符编码问题
May 24 Python
python3+PyQt5 实现Rich文本的行编辑方法
Jun 17 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
django如何实现视图重定向
Jul 24 Python
python程序 创建多线程过程详解
Sep 23 Python
pandas 像SQL一样使用WHERE IN查询条件说明
Jun 05 Python
Python使用Selenium实现淘宝抢单的流程分析
Jun 23 Python
超级实用的8个Python列表技巧
Aug 24 Python
python中操作文件的模块的方法总结
Feb 04 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/03/27 PHP
php输出全球各个时区列表的方法
2015/03/31 PHP
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
javascript事件函数中获得事件源的两种不错方法
2014/03/17 Javascript
jQuery实现单击和鼠标感应事件
2015/02/01 Javascript
js发送短信倒计时的简单实现方法
2016/09/08 Javascript
省市区三级联动jquery实现代码
2020/04/15 Javascript
Node.js中路径处理模块path详解
2016/11/14 Javascript
jQuery实现倒计时(倒计时年月日可自己输入)
2016/12/02 Javascript
利用js+css+html实现固定table的列头不动
2016/12/08 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
JavaScript比较两个数组的内容是否相同(推荐)
2017/05/02 Javascript
Vue keepAlive 数据缓存工具实现返回上一个页面浏览的位置
2019/05/10 Javascript
教你搭建按需加载的Vue组件库(小结)
2019/07/29 Javascript
详解webpack-dev-middleware 源码解读
2020/03/23 Javascript
Element Backtop回到顶部的具体使用
2020/07/27 Javascript
使用TS来编写express服务器的方法步骤
2020/10/29 Javascript
nuxt 服务器渲染动态设置 title和seo关键字的操作
2020/11/05 Javascript
javascript代码实现简易计算器
2021/01/25 Javascript
[35:27]完美世界DOTA2联赛循环赛 GXR vs FTD BO2第二场 10.29
2020/10/29 DOTA
[01:18:45]DOTA2-DPC中国联赛 正赛 DLG vs Dragon BO3 第三场2月1日
2021/03/11 DOTA
Python中import导入上一级目录模块及循环import问题的解决
2016/06/04 Python
python with语句的原理与用法详解
2020/03/30 Python
CSS3 border-radius圆角的实现方法及用法详解
2020/09/14 HTML / CSS
HTML5的革新 结构之美
2011/06/20 HTML / CSS
凯撒娱乐:Caesars Entertainment
2018/02/23 全球购物
淘宝网店营销策划书
2014/01/11 职场文书
三年级班级文化建设方案
2014/05/04 职场文书
服务标兵事迹材料
2014/05/04 职场文书
农村党员一句话承诺
2014/05/30 职场文书
2015年党员承诺书
2015/01/21 职场文书
社区三八妇女节活动总结
2015/02/06 职场文书
小学校长个人总结
2015/03/03 职场文书
2015年办税服务厅工作总结
2015/07/23 职场文书
Django中的JWT身份验证的实现
2021/05/07 Python
Tomcat弱口令复现及利用
2022/05/06 Servers