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翻译软件实现代码(使用google api完成)
Nov 26 Python
python基础教程之匿名函数lambda
Jan 17 Python
Python中使用支持向量机(SVM)算法
Dec 26 Python
解决pycharm工程启动卡住没反应的问题
Jan 19 Python
python实现维吉尼亚加密法
Mar 20 Python
pytorch程序异常后删除占用的显存操作
Jan 13 Python
对Tensorflow中tensorboard日志的生成与显示详解
Feb 04 Python
Pytorch mask_select 函数的用法详解
Feb 18 Python
django xadmin 管理器常用显示设置方式
Mar 11 Python
Python3爬虫中pyspider的安装步骤
Jul 29 Python
Python进度条的使用
May 17 Python
用python实现监控视频人数统计
May 21 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如何编写易读的代码
2007/07/10 PHP
让innerText在firefox火狐和IE浏览器都能用的写法
2011/05/14 Javascript
这段js代码得节约你多少时间
2011/12/20 Javascript
页面刷新时记住滚动条的位置jquery代码
2014/06/17 Javascript
javascript实现浏览器窗口传递参数的方法
2014/09/03 Javascript
详解JavaScript中的forEach()方法的使用
2015/06/08 Javascript
jQuery soColorPacker 网页拾色器
2016/06/22 Javascript
Vue.js每天必学之过滤器与自定义过滤器
2016/09/07 Javascript
JavaScript用JSONP跨域请求数据实例详解
2017/01/06 Javascript
详解vue-cli快速构建项目以及引入bootstrap、jq
2017/05/26 Javascript
vue修改vue项目运行端口号的方法
2017/08/04 Javascript
Vue 项目部署到服务器的问题解决方法
2017/12/05 Javascript
JavaScript简单实现动态改变HTML内容的方法示例
2018/12/25 Javascript
基于iview-admin实现动态路由的示例代码
2019/10/02 Javascript
谈谈我在vue-cli3中用预渲染遇到的坑
2020/04/22 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
Python多线程编程简单介绍
2015/04/13 Python
对Python3+gdal 读取tiff格式数据的实例讲解
2018/12/04 Python
配置python的编程环境之Anaconda + VSCode的教程
2020/03/29 Python
用Python在Excel里画出蒙娜丽莎的方法示例
2020/04/28 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
如何用 Python 处理不平衡数据集
2021/01/04 Python
canvas实现高阶贝塞尔曲线(N阶贝塞尔曲线生成器)
2018/01/10 HTML / CSS
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
学校运动会开幕演讲稿
2014/01/04 职场文书
项目施工员岗位职责
2014/03/09 职场文书
基层党组织公开承诺书
2014/03/28 职场文书
委托公证书
2014/04/08 职场文书
中学生评语大全
2014/04/18 职场文书
毕业生找工作求职信
2014/08/05 职场文书
企业授权委托书范本
2014/09/22 职场文书
街道社区活动报告
2015/02/05 职场文书
2015年社区居委会工作总结
2015/05/18 职场文书
运动会广播稿100字
2015/08/19 职场文书
MySQL 覆盖索引的优点
2021/05/19 MySQL
Python图像处理库PIL详细使用说明
2022/04/06 Python