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面向对象之类的内置attr属性示例
Dec 14 Python
python之验证码生成(gvcode与captcha)
Jan 02 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
django foreignkey(外键)的实现
Jul 29 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
复化梯形求积分实例——用Python进行数值计算
Nov 20 Python
python隐藏类中属性的3种实现方法
Dec 19 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
使用Python制作一个数据预处理小工具(多种操作一键完成)
Feb 07 Python
selenium.webdriver中add_argument方法常用参数表
Apr 08 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 Python
一些让Python代码简洁的实用技巧总结
Aug 23 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
自制汽车收音机天线:收听广播的技巧和方法
2021/03/02 无线电
destoon二次开发常用数据库操作
2014/06/21 PHP
解析PHP强制转换类型及远程管理插件的安全隐患
2014/06/30 PHP
destoon实现调用当前栏目分类及子分类和三级分类的方法
2014/08/21 PHP
PHP利用func_get_args和func_num_args函数实现函数重载实例
2014/11/12 PHP
关于URL最大长度限制的相关资料查证
2014/12/23 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
PHP仿tp实现mvc框架基本设计思路与实现方法分析
2018/05/23 PHP
php封装的pdo数据库操作工具类与用法示例
2019/05/08 PHP
TP5框架实现自定义分页样式的方法示例
2020/04/05 PHP
让你的网站可编辑的实现js代码
2009/10/19 Javascript
Firefox下提示illegal character并出现乱码的原因
2010/03/25 Javascript
DD_belatedPNG,IE6下PNG透明解决方案(国外)
2010/12/06 Javascript
js 获取屏幕各种宽高的方法(浏览器兼容)
2013/05/15 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
网站繁简切换的JS遇到页面卡死的解决方法
2014/03/12 Javascript
Jquery原生态实现表格header头随滚动条滚动而滚动
2014/03/18 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
JavaScript判断图片是否已经加载完毕的方法汇总
2016/02/05 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
浏览器复制插件zeroclipboard使用指南
2016/03/26 Javascript
移动端横屏的JS代码(beta)
2016/05/16 Javascript
Angular实现可删除并计算总金额的购物车功能示例
2017/12/26 Javascript
JS高阶函数原理与用法实例分析
2019/01/15 Javascript
Ant-design-vue Table组件customRow属性的使用说明
2020/10/28 Javascript
探究数组排序提升Python程序的循环的运行效率的原因
2015/04/01 Python
Python字符串的常见操作实例小结
2019/04/08 Python
Python函数和模块的使用总结
2019/05/20 Python
Pycharm配置autopep8实现流程解析
2020/11/28 Python
python对输出的奇数偶数排序实例代码
2020/12/04 Python
HTML5+CSS设置浮动却没有动反而在中间且错行的问题
2020/05/26 HTML / CSS
金融专业个人的自我评价
2013/10/18 职场文书
公司领导推荐信
2013/11/12 职场文书
学校岗位设置方案
2014/01/16 职场文书
2015年绩效考核工作总结
2015/05/23 职场文书
html中两种获取标签内的值的方法
2022/06/16 jQuery