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利用beautifulSoup实现爬虫
Sep 29 Python
python通过yield实现数组全排列的方法
Mar 18 Python
如何使用七牛Python SDK写一个同步脚本及使用教程
Aug 23 Python
Python3使用requests发闪存的方法
May 11 Python
使用tensorflow实现AlexNet
Nov 20 Python
Python排序算法之选择排序定义与用法示例
Apr 29 Python
详解Python最长公共子串和最长公共子序列的实现
Jul 07 Python
python爬取指定微信公众号文章
Dec 20 Python
python使用KNN算法识别手写数字
Apr 25 Python
Python的形参和实参使用方式
Dec 24 Python
2021年的Python 时间轴和即将推出的功能详解
Jul 27 Python
Django rest framework分页接口实现原理解析
Aug 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 PDO中文乱码解决办法
2009/07/20 PHP
一段利用WSH获取登录时间的jscript代码
2008/05/11 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
jQuery 常见开发使用技巧总结
2009/12/26 Javascript
javascript实现playfair和hill密码算法
2014/12/07 Javascript
JS获取各种宽度、高度的简单介绍
2014/12/19 Javascript
PHP和NodeJs开发的应用如何共用Session
2015/04/16 NodeJs
JQuery中DOM实现事件移除的方法
2015/06/13 Javascript
javascript制作照片墙及制作过程中出现的问题
2016/04/04 Javascript
JQuery组件基于Bootstrap的DropDownList(完整版)
2016/07/05 Javascript
微信JS-SDK自定义分享功能实例详解【分享给朋友/分享到朋友圈】
2016/11/25 Javascript
原生javascript实现分页效果
2017/04/21 Javascript
js-FCC算法-No repeats please字符串的全排列(详解)
2017/05/02 Javascript
基于Vue实例对象的数据选项
2017/08/09 Javascript
使用Angular CLI生成 Angular 5项目教程详解
2018/03/18 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
JavaScript表格隔行变色和Tab标签页特效示例【附jQuery版】
2019/07/11 jQuery
移动端手指操控左右滑动的菜单
2019/09/08 Javascript
uniapp开发小程序实现滑动页面控制元素的显示和隐藏效果
2020/12/10 Javascript
详解duck typing鸭子类型程序设计与Python的实现示例
2016/06/03 Python
Python实现判断一个字符串是否包含子串的方法总结
2017/11/21 Python
python3操作注册表的方法(Url protocol)
2020/02/05 Python
解决keras加入lambda层时shape的问题
2020/06/11 Python
python 从list中随机取值的方法
2020/11/16 Python
css3 旋转按钮 使用CSS3创建一个旋转可变色按钮
2012/12/31 HTML / CSS
利用纯CSS3实现tab选项卡切换示例代码
2016/09/21 HTML / CSS
在家更换处方镜片:Lensabl
2019/05/01 全球购物
精选干货:Java精选笔试题附答案
2014/01/18 面试题
《北大荒的秋天》教学反思
2014/04/14 职场文书
村级换届选举方案
2014/05/10 职场文书
村党的群众路线教育实践活动工作总结
2014/10/25 职场文书
2015年初中元旦晚会活动总结
2014/11/28 职场文书
避暑山庄导游词
2015/02/04 职场文书
原生Javascript+HTML5一步步实现拖拽排序
2021/06/12 Javascript
vue+element ui实现锚点定位
2021/06/29 Vue.js
MySQL创建定时任务
2022/01/22 MySQL