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中请使用isinstance()判断变量类型
Aug 25 Python
python编程开发之textwrap文本样式处理技巧
Nov 13 Python
Python反射的用法实例分析
Feb 11 Python
python中join()方法介绍
Oct 11 Python
Python3对称加密算法AES、DES3实例详解
Dec 06 Python
python twilio模块实现发送手机短信功能
Aug 02 Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 Python
Python matplotlib绘制图形实例(包括点,曲线,注释和箭头)
Apr 17 Python
Python捕获异常堆栈信息的几种方法(小结)
May 18 Python
python各种excel写入方式的速度对比
Nov 10 Python
用python查找统一局域网下ip对应的mac地址
Jan 13 Python
Python中for后接else的语法使用
May 18 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入门学习知识点五 关于php数组的几个基本操作
2011/07/14 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP CURL CURLOPT参数说明(curl_setopt)
2013/09/30 PHP
yii上传文件或图片实例
2014/04/01 PHP
一个PHP的ZIP压缩类分享
2014/05/04 PHP
PHP的openssl加密扩展使用小结(推荐)
2016/07/18 PHP
PHP检测数据类型的几种方法(总结)
2017/03/04 PHP
PHP unlink与rmdir删除目录及目录下所有文件实例代码
2018/02/07 PHP
Laravel6.2中用于用户登录的新密码确认流程详解
2019/10/16 PHP
THINKPHP-Apache服务器中使用Alias虚拟目录URL重写 隐藏index.php
2021/03/09 PHP
IE6,IE7,IE8下使用Javascript记录光标选中范围(已补全)
2011/08/28 Javascript
jQuery的内容过滤选择器学习教程
2016/04/18 Javascript
Bootstrap源码解读下拉菜单(4)
2016/12/23 Javascript
jquery实现自适应banner焦点图
2017/02/16 Javascript
javascript防篡改对象实例详解
2017/04/10 Javascript
详解create-react-app 2.0版本如何启用装饰器语法
2018/10/23 Javascript
JS实现秒杀倒计时特效
2020/01/02 Javascript
Python简单网络编程示例【客户端与服务端】
2017/05/26 Python
python实现画圆功能
2018/01/25 Python
python简单操作excle的方法
2018/09/12 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
python实现实时视频流播放代码实例
2020/01/11 Python
深入了解Python 变量作用域
2020/07/24 Python
轻松掌握CSS3中的字体大小单位rem的使用方法
2016/05/24 HTML / CSS
Fashion Eyewear美国:英国线上设计师眼镜和太阳镜的零售商
2016/08/15 全球购物
澳大利亚工具仓库:Tools Warehouse
2018/10/15 全球购物
3D空间设计学生找工作的自我评价
2013/10/28 职场文书
企业宗旨标语
2014/06/10 职场文书
参赛口号
2014/06/16 职场文书
高三霸气励志标语
2014/06/24 职场文书
公司副总经理岗位职责
2014/10/01 职场文书
2015中学政教处工作总结
2015/07/22 职场文书
学风建设主题班会
2015/08/17 职场文书
python tkinter模块的简单使用
2021/04/07 Python
nginx 添加http_stub_status_module模块
2022/05/25 Servers
教你如何用cmd快速登录服务器
2022/06/10 Servers