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抓取网页正文的源码
Jun 11 Python
Python中replace方法实例分析
Aug 20 Python
Python设计模式编程中Adapter适配器模式的使用实例
Mar 02 Python
python验证码识别的实例详解
Sep 09 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
Apr 23 Python
基于python 二维数组及画图的实例详解
Apr 03 Python
Python3爬楼梯算法示例
Mar 04 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
Python MySQLdb 执行sql语句时的参数传递方式
Mar 04 Python
Python参数传递对象的引用原理解析
May 22 Python
Python实现Keras搭建神经网络训练分类模型教程
Jun 12 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 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数组函数序列之end() - 移动数组内部指针到最后一个元素,并返回该元素的值
2011/10/31 PHP
使用PHP编写发红包程序
2015/07/22 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
jQuery+css+html实现页面遮罩弹出框
2013/03/21 Javascript
js遍历、动态的添加数据的小例子
2013/06/22 Javascript
JS Map 和 List 的简单实现代码
2013/07/08 Javascript
php显示当前文件所在的文件以及文件夹所有文件以树形展开
2013/12/13 Javascript
为指定的元素添加遮罩层的示例代码
2014/01/15 Javascript
跟我学习javascript的函数和函数表达式
2015/11/16 Javascript
理解javascript正则表达式
2016/03/08 Javascript
JavaScript 经典实例日常收集整理(常用经典)
2016/03/30 Javascript
基于WebUploader的文件上传js插件
2016/08/19 Javascript
Javascript中this绑定的3种方法与比较
2016/10/13 Javascript
用vue的双向绑定简单实现一个todo-list的示例代码
2017/08/03 Javascript
vue项目中使用tinymce编辑器的步骤详解
2018/09/11 Javascript
Vue页面跳转动画效果的实现方法
2018/09/23 Javascript
记录vue做微信自定义分享的一些问题
2019/09/12 Javascript
js闭包的9个使用场景
2020/12/29 Javascript
python列表操作使用示例分享
2014/02/21 Python
Python设计模式之代理模式实例
2014/04/26 Python
Pandas中Series和DataFrame的索引实现
2019/06/27 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
快速查找Python安装路径方法
2020/02/06 Python
Python3基于print打印带颜色字符串
2020/07/06 Python
python调用私有属性的方法总结
2020/07/24 Python
python中最小二乘法详细讲解
2021/02/19 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
Ted Baker美国官网:英国时尚品牌
2018/10/29 全球购物
德国高尔夫商店:Par71.de
2020/11/29 全球购物
澳大利亚家具商店:Freedom
2020/12/17 全球购物
绩效工资实施方案
2014/03/15 职场文书
《雨点儿》教学反思
2014/04/14 职场文书
向国旗敬礼活动总结
2014/09/27 职场文书
毕业班工作总结
2015/08/10 职场文书
Vue图片裁剪组件实例代码
2021/07/02 Vue.js