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对html代码进行escape编码的方法
May 04 Python
Python装饰器基础详解
Mar 09 Python
Python json 错误xx is not JSON serializable解决办法
Mar 15 Python
python 迭代器和iter()函数详解及实例
Mar 21 Python
pygame实现简易飞机大战
Sep 11 Python
python保存二维数组到txt文件中的方法
Nov 15 Python
python解压TAR文件至指定文件夹的实例
Jun 10 Python
使用tensorflow框架在Colab上跑通猫狗识别代码
Apr 26 Python
彻底搞懂python 迭代器和生成器
Sep 07 Python
python中uuid模块实例浅析
Dec 29 Python
Python Django框架介绍之模板标签及模板的继承
May 27 Python
一文搞懂python异常处理、模块与包
Jun 26 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
文章推荐系统(二)
2006/10/09 PHP
php设计模式 Delegation(委托模式)
2011/06/26 PHP
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
腾讯QQ微博API接口获取微博内容
2013/10/30 PHP
PHP使用PDO操作数据库的乱码问题解决方法
2016/04/08 PHP
Opacity.js
2007/01/22 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
原生js和jquery中有关透明度设置的相关问题
2014/01/08 Javascript
常规表格多表头查询示例
2014/02/21 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
javascript搜索框效果实现方法
2015/05/14 Javascript
JavaScript中isPrototypeOf函数作用和使用实例
2015/06/01 Javascript
jQuery 弹出层插件(推荐)
2016/05/24 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
Vue cli3 库模式搭建组件库并发布到 npm的流程
2018/10/12 Javascript
JS实现判断有效的数独算法示例
2019/02/25 Javascript
解决vue中el-tab-pane切换的问题
2020/07/19 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
简单介绍Python中的几种数据类型
2016/01/02 Python
Python字符串、元组、列表、字典互相转换的方法
2016/01/23 Python
使用keras实现孪生网络中的权值共享教程
2020/06/11 Python
Python使用xpath实现图片爬取
2020/09/16 Python
HTML5 Canvas入门学习教程
2016/03/17 HTML / CSS
日本最大的药妆连锁店:Matsukiyo松本清药妆店
2017/11/23 全球购物
SAZAC的动物连体衣和动物睡衣:Kigurumi Shop
2020/03/14 全球购物
护士个人简历自荐信
2013/10/18 职场文书
公务员个人自我评价分享
2013/11/06 职场文书
物流管理应届生求职信
2013/11/07 职场文书
心得体会范文
2014/01/04 职场文书
共产党员岗位承诺书
2014/05/29 职场文书
计划生育标语
2014/06/23 职场文书
应聘护士求职信
2014/07/21 职场文书
三严三实学习心得体会
2014/10/13 职场文书
初中教师个人工作总结
2015/02/10 职场文书