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 linecache.getline()读取文件中特定一行的脚本
Sep 06 Python
Python实现Tab自动补全和历史命令管理的方法
Mar 12 Python
学习python类方法与对象方法
Mar 15 Python
Python中顺序表的实现简单代码分享
Jan 09 Python
PyQT实现多窗口切换
Apr 20 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
使用TensorFlow实现简单线性回归模型
Jul 19 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
解决运行出现'dict' object has no attribute 'has_key'问题
Jul 15 Python
Python如何使用input函数获取输入
Aug 06 Python
基于Python实现将列表数据生成折线图
Mar 23 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 批量删除数据的方法分析
2009/10/30 PHP
PHP-CGI进程CPU 100% 与 file_get_contents 函数的关系分析
2011/08/15 PHP
PHP+jquery实时显示网站在线人数的方法
2015/01/04 PHP
php curl发送请求实例方法
2019/08/01 PHP
javascript 动态调整图片尺寸实现代码
2009/12/28 Javascript
js实现的切换面板实例代码
2013/06/17 Javascript
简单常用的幻灯片播放实现代码
2013/09/25 Javascript
使用AngularJS制作一个简单的RSS阅读器的教程
2015/06/18 Javascript
利用HTML5的画布Canvas实现刮刮卡效果
2015/09/06 Javascript
浅谈js在html中的加载执行顺序,多个jquery ready执行顺序
2016/11/26 Javascript
js 博客内容进度插件详解
2017/02/19 Javascript
微信小程序图片横向左右滑动案例
2017/05/19 Javascript
BootStrap模态框和select2合用时input无法获取焦点的解决方法
2017/09/01 Javascript
代码实例ajax实现点击加载更多数据图片
2018/10/12 Javascript
微信小程序使用npm包的方法步骤
2019/08/13 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
JavaScript canvas绘制圆弧与圆形
2020/02/18 Javascript
javascript实现拖拽碰撞检测
2020/03/12 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
Python ljust rjust center输出
2008/09/06 Python
python 添加用户设置密码并发邮件给root用户
2016/07/25 Python
浅谈Python类的__getitem__和__setitem__特殊方法
2016/12/25 Python
解决python3 json数据包含中文的读写问题
2018/05/10 Python
Python 创建新文件时避免覆盖已有的同名文件的解决方法
2018/11/16 Python
详解如何用django实现redirect的几种方法总结
2018/11/22 Python
Python3 中sorted() 函数的用法
2020/03/24 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
python用Configobj模块读取配置文件
2020/09/26 Python
python中Array和DataFrame相互转换的实例讲解
2021/02/03 Python
使用html5新特性轻松监听任何App自带返回键的示例
2018/03/13 HTML / CSS
幼儿园标语大全
2014/06/19 职场文书
做一个有道德的人活动实施方案
2014/08/23 职场文书
不听老师话的万能检讨书
2014/10/04 职场文书
初三学生语文考试作弊检讨书
2014/12/14 职场文书
2015年学生管理工作总结
2015/05/26 职场文书
Js类的构建与继承案例详解
2021/09/15 Javascript