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导入txt数据到mysql的方法
Apr 08 Python
python数据清洗系列之字符串处理详解
Feb 12 Python
CentOS中升级Python版本的方法详解
Jul 10 Python
Python subprocess模块详细解读
Jan 29 Python
pandas数据清洗,排序,索引设置,数据选取方法
May 18 Python
详解python的sorted函数对字典按key排序和按value排序
Aug 10 Python
Python 计算任意两向量之间的夹角方法
Jul 05 Python
python快速排序的实现及运行时间比较
Nov 22 Python
pytorch自定义二值化网络层方式
Jan 07 Python
Python定时器线程池原理详解
Feb 26 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
Python控制鼠标键盘代码实例
Dec 08 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 date函数参数详解
2006/11/27 PHP
curl不使用文件存取cookie php使用curl获取cookie示例
2014/01/26 PHP
php通过rmdir删除目录的简单用法
2015/03/18 PHP
Yii框架用户登录session丢失问题解决方法
2017/01/07 PHP
php正确输出json数据的实例讲解
2018/08/21 PHP
PDO::exec讲解
2019/01/28 PHP
js类后台管理菜单类-MenuSwitch
2007/09/12 Javascript
setTimeout与setInterval在不同浏览器下的差异
2010/01/24 Javascript
jquery实现先淡出再折叠收起的动画效果
2015/08/07 Javascript
利用jQuery插件imgAreaSelect实现获得选择域的图像信息
2016/12/02 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
详解javascript中对数据格式化的思考
2017/01/23 Javascript
gulp安装以及打包合并的方法教程
2017/11/19 Javascript
Electron 如何调用本地模块的方法
2019/02/01 Javascript
深入解读Node.js中的koa源码
2019/06/17 Javascript
微信小程序文字显示换行问题
2019/07/28 Javascript
对layer弹出框中icon数字参数的说明介绍
2019/09/04 Javascript
微信小程序实现简单文字跑马灯
2020/05/26 Javascript
Vue路由 重定向和别名的区别说明
2020/09/09 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
2020/10/26 Javascript
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
python Django模板的使用方法(图文)
2013/11/04 Python
Python3.6正式版新特性预览
2016/12/15 Python
分享Pycharm中一些不为人知的技巧
2018/04/03 Python
python判断输入日期为第几天的实例
2018/11/13 Python
python获取引用对象的个数方式
2019/12/20 Python
python 获取当前目录下的文件目录和文件名实例代码详解
2020/03/10 Python
不到20行实现Python代码即可制作精美证件照
2020/04/24 Python
HTML5和CSS3让网页设计提升到下一个高度
2009/08/14 HTML / CSS
input file上传文件样式支持html5的浏览器解决方案
2012/11/14 HTML / CSS
Ratchet 模态框的实现
2020/08/19 HTML / CSS
乌克兰在线商店的价格比较:Price.ua
2019/07/26 全球购物
用Python写一个for循环的例子
2016/07/19 面试题
2014年银行信贷员工作总结
2014/12/08 职场文书
社会实践活动总结
2015/02/05 职场文书
小学四年级作文之写景
2019/08/23 职场文书