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中使用Boolean操作符做真值测试实例
Jan 30 Python
Linux系统上Nginx+Python的web.py与Django框架环境
Dec 25 Python
浅析python打包工具distutils、setuptools
Apr 20 Python
django2用iframe标签完成网页内嵌播放b站视频功能
Jun 20 Python
解决python通过cx_Oracle模块连接Oracle乱码的问题
Oct 18 Python
Python面向对象思想与应用入门教程【类与对象】
Apr 12 Python
如何使用Python实现自动化水军评论
Jun 26 Python
Django rstful登陆认证并检查session是否过期代码实例
Aug 13 Python
浅析Python __name__ 是什么
Jul 07 Python
Matplotlib中%matplotlib inline如何使用
Jul 28 Python
python实现简单猜单词游戏
Dec 24 Python
Pycharm制作搞怪弹窗的实现代码
Feb 19 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
老机欣赏|中国60年代精品收音机
2021/03/02 无线电
php错误提示failed to open stream: HTTP request failed!的完美解决方法
2011/06/06 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
详解使用php-cs-fixer格式化代码
2020/09/16 PHP
JS图像无缝滚动脚本非常好用
2014/02/10 Javascript
将json对象转换为字符串的方法
2014/02/20 Javascript
js获取当前地址 JS获取当前URL的示例代码
2014/02/26 Javascript
Android中的jQuery:AQuery简介
2014/05/06 Javascript
AngularJS入门教程(二):AngularJS模板
2014/12/06 Javascript
jQuery实现气球弹出框式的侧边导航菜单效果
2015/09/22 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
如何编写一个完整的Angular4 FormText 组件
2017/11/18 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
LayUI数据接口返回实体封装的例子
2019/09/12 Javascript
javascript中的offsetWidth、clientWidth、innerWidth及相关属性方法
2020/05/14 Javascript
[16:21]教你分分钟做大人:圣堂刺客
2014/12/03 DOTA
更改Python命令行交互提示符的方法
2015/01/14 Python
分析Python中解析构建数据知识
2018/01/20 Python
Python命令行解析模块详解
2018/02/01 Python
Python 获取div标签中的文字实例
2018/12/20 Python
Python实现通过解析域名获取ip地址的方法分析
2019/05/17 Python
详解使用Python下载文件的几种方法
2019/10/13 Python
python turtle 绘制太极图的实例
2019/12/18 Python
python不到50行代码完成了多张excel合并的实现示例
2020/05/28 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
2020/11/02 Python
定制别致的瑜伽垫:Sugarmat
2019/06/21 全球购物
毕业生精彩的自我评价分享
2013/10/06 职场文书
行政办公员自我评价分享
2013/12/14 职场文书
写给女生的道歉信
2014/01/08 职场文书
物流专业大学生职业生涯规划书范文
2014/01/15 职场文书
设计师个人求职信范文
2014/02/02 职场文书
办护照工作证明
2014/10/01 职场文书
关于倡议书的范文
2015/04/29 职场文书
零基础学java之循环语句的使用
2022/04/10 Java/Android