Python的互斥锁与信号量详解


Posted in Python onSeptember 12, 2019

并发与锁

多个线程共享数据的时候,如果数据不进行保护,那么可能出现数据不一致现象,使用锁,信号量、条件锁

互斥锁

1. 互斥锁,是使用一把锁把代码保护起来,以牺牲性能换取代码的安全性,那么Rlock后 必须要relase 解锁 不然将会失去多线程程序的优势

2. 互斥锁的基本使用规则:

import threading
# 声明互斥锁
lock=threading.Rlock();
def handle(sid):# 功能实现代码
lock.acquire() #加锁
# writer codeing
lock.relase() #释放锁

信号量:

1. 调用relarse()信号量会+1 调用 acquire() 信号量会-1

可以理解为对于临界资源的使用,以及进入临界区的判断条件

2. semphore() :当调用relarse()函数的时候 单纯+1 不会检查信号量的上限情况。 初始参数为0

3. boudedsemphore():边界信号量 当调用relarse() 会+1 , 并且会检查信号量的上限情况。不允许超过上限

使用budedsemaphore时候不允许设置初始为0,将会抛出异常

至少设置为1 ,如consumer product 时候应该在外设置一个变量,启动时候对变量做判断,决定使不使用acquier

4. 信号量的基本使用代码:

# 声明信号量:
sema=threading.Semaphore(0); #无上限检查
sema=threading.BuderedSeamphore(1) #有上限检查设置
5
apple=1
def consumner():
seam.acquire(); # ?1
9
if apple==1:
pass
else: sema2.release();#+ 1
def product():
seam.relarse(); # +1
if apple==1:
pass
else:
print("消费:",apple);

全部的代码:

# -*- coding: utf-8 -*-
"""
Created on Mon Sep 9 21:49:30 2019

@author: DGW-PC
"""
# 信号量解决生产者消费者问题
import random;
import threading;
import time;

# 声明信号量
sema=threading.Semaphore(0);# 必须写参数 0 表示可以使用数
sema2=threading.BoundedSemaphore(1);

apple=1;

def product():#生产者
  global apple;
  apple=random.randint(1,100);
  time.sleep(3);
  print("生成苹果:",apple);
  #sema2.release(); # +1
  if apple==1:
     pass
  else: sema2.release();#+ 1 
    
def consumer():
  print("等待");
  sema2.acquire();# -1
  if apple==1:
    pass
  else:    
    print("消费:",apple);
threads=[];

for i in range(1,3):
  t1=threading.Thread(target=consumer);
  t2=threading.Thread(target=product);
  t1.start();
  t2.start();
  threads.append(t1);
  threads.append(t2);
for x in threads:
  x.join();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python遍历数组的方法小结
Apr 30 Python
进一步探究Python的装饰器的运用
May 05 Python
python实现JAVA源代码从ANSI到UTF-8的批量转换方法
Aug 10 Python
举例讲解Python面向对象编程中类的继承
Jun 17 Python
python使用KNN算法识别手写数字
Apr 25 Python
python实现翻转棋游戏(othello)
Jul 29 Python
tesserocr与pytesseract模块的使用方法解析
Aug 30 Python
基于nexus3配置Python仓库过程详解
Jun 15 Python
10行Python代码实现Web自动化管控的示例代码
Aug 14 Python
PyCharm 2020.2 安装详细教程
Sep 25 Python
python Cartopy的基础使用详解
Nov 01 Python
python3 实现mysql数据库连接池的示例代码
Apr 17 Python
python使用sklearn实现决策树的方法示例
Sep 12 #Python
Python环境Pillow( PIL )图像处理工具使用解析
Sep 12 #Python
Python列表删除元素del、pop()和remove()的区别小结
Sep 11 #Python
python conda操作方法
Sep 11 #Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 #Python
浅谈Django+Gunicorn+Nginx部署之路
Sep 11 #Python
初次部署django+gunicorn+nginx的方法步骤
Sep 11 #Python
You might like
PHP isset()与empty()的使用区别详解
2010/08/29 PHP
php递归创建和删除文件夹的代码小结
2012/04/13 PHP
PHP 处理TXT文件(打开/关闭/检查/读取)
2013/05/13 PHP
PHP MYSQL实现登陆和模糊查询两大功能
2016/02/05 PHP
PHP错误处理函数
2016/04/03 PHP
javascript中关于执行环境的杂谈
2011/08/14 Javascript
在jQuery ajax中按钮button和submit的区别分析
2012/10/07 Javascript
nullJavascript中创建对象的五种方法实例
2013/05/07 Javascript
SeaJS 与 RequireJS 的差异对比
2014/12/08 Javascript
js+css实现的圆角边框TAB选项卡滑动门代码分享(2款)
2015/08/26 Javascript
读Javascript高性能编程重点笔记
2016/12/21 Javascript
纯js实现页面返回顶部的动画(超简单)
2017/08/10 Javascript
vue和react等项目中更简单的实现展开收起更多等效果示例
2018/02/22 Javascript
Vue 中mixin 的用法详解
2018/04/23 Javascript
vue中get请求如何传递数组参数的方法示例
2019/11/08 Javascript
阿望教你用vue写扫雷小游戏
2020/01/20 Javascript
Node.js API详解之 string_decoder用法实例分析
2020/04/29 Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
2020/06/01 Javascript
用python实现的去除win下文本文件头部BOM的代码
2013/02/10 Python
Python语言实现将图片转化为html页面
2017/12/06 Python
python获取微信小程序手机号并绑定遇到的坑
2018/11/19 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
python 多维高斯分布数据生成方式
2019/12/09 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
美国室内和室外装饰花盆购物网站:ePlanters
2019/03/22 全球购物
为什么使用接口?
2014/08/13 面试题
公司培训欢迎词
2014/01/10 职场文书
技校个人求职信范文
2014/01/25 职场文书
商务日语专业毕业生自荐信
2014/03/27 职场文书
优秀纪检干部材料
2014/08/27 职场文书
个人工作保证书
2015/02/28 职场文书
北京爱情故事观后感
2015/06/12 职场文书
埃及王子观后感
2015/06/16 职场文书
认识实习感想
2015/08/10 职场文书
python Django框架快速入门教程(后台管理)
2021/07/21 Python
postgresql 删除重复数据案例详解
2021/08/02 PostgreSQL