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获取android设备的GPS信息脚本分享
Mar 06 Python
pygame学习笔记(2):画点的三种方法和动画实例
Apr 15 Python
使用基于Python的Tornado框架的HTTP客户端的教程
Apr 24 Python
Python求算数平方根和约数的方法汇总
Mar 09 Python
如何高效使用Python字典的方法详解
Aug 31 Python
python使用pandas实现数据分割实例代码
Jan 25 Python
python如何通过twisted实现数据库异步插入
Mar 20 Python
对Python中gensim库word2vec的使用详解
May 08 Python
Python线程之定位与销毁的实现
Feb 17 Python
详解python tkinter教程-事件绑定
Mar 28 Python
django多对多表的创建,级联删除及手动创建第三张表
Jul 25 Python
Python对excel的基本操作方法
Feb 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获取当前文件的父目录方法汇总
2016/07/21 PHP
Yii2创建表单(ActiveForm)方法详解
2016/07/23 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
PHP类的自动加载与命名空间用法实例分析
2020/06/05 PHP
jquery移动listbox的值原理及代码
2013/05/03 Javascript
javascript ajax 仿百度分页函数
2013/10/29 Javascript
基于jquery异步传输json数据格式实例代码
2013/11/23 Javascript
JavaScript中的apply和call函数详解
2014/07/20 Javascript
jQuery结合AJAX之在页面滚动时从服务器加载数据
2015/06/30 Javascript
jQuery Validate表单验证深入学习
2015/12/18 Javascript
Node.js读写文件之批量替换图片的实现方法
2016/09/07 Javascript
JavaScript省市级联下拉菜单实例
2017/02/14 Javascript
学习使用Bootstrap栅格系统
2017/05/11 Javascript
express默认日志组件morgan的方法
2018/04/05 Javascript
微信小程序实现的3d轮播图效果示例【基于swiper组件】
2018/12/11 Javascript
详解 微信小程序开发框架(MINA)
2019/05/17 Javascript
vue-router之实现导航切换过渡动画效果
2019/10/31 Javascript
使用Python来开发Markdown脚本扩展的实例分享
2016/03/04 Python
Python简单的制作图片验证码实例
2017/05/31 Python
Python unittest模块用法实例分析
2018/05/25 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
2019/06/13 Python
pyqt5让图片自适应QLabel大小上以及移除已显示的图片方法
2019/06/21 Python
python 实现单例模式的5种方法
2020/09/23 Python
css3 column实现卡片瀑布流布局的示例代码
2018/06/22 HTML / CSS
Draper James官网:知名演员瑞茜·威瑟斯彭所创品牌
2017/10/25 全球购物
管理站站长岗位职责
2013/11/27 职场文书
学习十八大报告感言
2014/02/04 职场文书
大学学习个人的自我评价
2014/02/18 职场文书
企业法人授权委托书
2014/04/03 职场文书
保护环境建议书100字
2014/05/13 职场文书
环保宣传标语
2014/06/12 职场文书
九一八事变演讲稿
2014/09/05 职场文书
高考升学宴答谢词
2015/01/20 职场文书
古诗之感恩老师
2019/10/24 职场文书
OpenCV-Python实现人脸美白算法的实例
2021/06/11 Python
MyBatis在注解上使用动态SQL方式(@select使用if)
2022/07/07 Java/Android