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数据结构与算法之列表(链表,linked list)简单实现
Oct 30 Python
基于Python log 的正确打开方式
Apr 28 Python
在Python中使用gRPC的方法示例
Aug 08 Python
使用Python实现在Windows下安装Django
Oct 17 Python
python实现字符串加密成纯数字
Mar 19 Python
python视频按帧截取图片工具
Jul 23 Python
python 图像的离散傅立叶变换实例
Jan 02 Python
Python 剪绳子的多种思路实现(动态规划和贪心)
Feb 24 Python
Python通过递归函数输出嵌套列表元素
Oct 15 Python
Python爬虫爬取全球疫情数据并存储到mysql数据库的步骤
Mar 29 Python
Python中的datetime包与time包包和模块详情
Feb 28 Python
ubuntu安装jupyter并设置远程访问的实现
Mar 31 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之APC缓存详细介绍 apc模块安装
2014/01/13 PHP
PHP命名空间用法实例分析
2019/09/04 PHP
JavaScript 对话框和状态栏使用说明
2009/10/25 Javascript
JavaScript操作XML 使用百度RSS作为新闻源示例
2012/02/17 Javascript
使用GruntJS链接与压缩多个JavaScript文件过程详解
2013/08/02 Javascript
再探JavaScript作用域
2014/09/24 Javascript
基于NodeJS的前后端分离的思考与实践(五)多终端适配
2014/09/26 NodeJs
jQuery实现鼠标划过修改样式的方法
2015/04/14 Javascript
jQuery Layer弹出层传值到父页面的实现代码
2017/08/17 jQuery
微信小程序页面滑动屏幕加载数据效果
2020/11/16 Javascript
基于zTree树形菜单的使用实例
2017/12/25 Javascript
Vue.js实现可配置的登录表单代码详解
2018/03/29 Javascript
jQuery实现的简单拖拽功能示例【测试可用】
2018/08/14 jQuery
vue组件开发props验证的实现
2019/02/12 Javascript
layui清除radio的选中状态实例
2019/11/14 Javascript
vue相同路由跳转强制刷新该路由组件操作
2020/08/05 Javascript
Python的Urllib库的基本使用教程
2015/04/30 Python
实例讲解Python编程中@property装饰器的用法
2016/06/20 Python
Python cookbook(数据结构与算法)根据字段将记录分组操作示例
2018/03/19 Python
Python贪心算法实例小结
2018/04/22 Python
djang常用查询SQL语句的使用代码
2019/02/15 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
英国电视和家用电器购物网站:rlrdistribution.co.uk
2018/11/20 全球购物
牛津在线药房:Oxford Online Pharmacy
2020/11/16 全球购物
经典的班主任推荐信
2013/10/28 职场文书
学生打架检讨书大全
2014/01/23 职场文书
材料加工工程求职信
2014/02/19 职场文书
《少年王冕》教学反思
2014/04/11 职场文书
幼儿园评语大全
2014/04/17 职场文书
任命书范本大全
2014/06/06 职场文书
重阳节活动总结
2014/08/27 职场文书
教师批评与自我批评剖析材料
2014/10/16 职场文书
2015新教师教学工作总结
2015/07/22 职场文书
初中英语教学随笔
2015/08/15 职场文书
python操作xlsx格式文件并读取
2021/06/02 Python
vue 给数组添加新对象并赋值
2022/04/20 Vue.js