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 相关文章推荐
解决windows下Sublime Text 2 运行 PyQt 不显示的方法分享
Jun 18 Python
使用Python3 编写简单信用卡管理程序
Dec 21 Python
Python实现字符串格式化输出的方法详解
Sep 20 Python
python中hashlib模块用法示例
Oct 30 Python
Python内置函数reversed()用法分析
Mar 20 Python
教你使用python画一朵花送女朋友
Mar 29 Python
可能是最全面的 Python 字符串拼接总结【收藏】
Jul 09 Python
详解python中递归函数
Apr 16 Python
python实现字典嵌套列表取值
Dec 16 Python
python GUI库图形界面开发之PyQt5动态加载QSS样式文件
Feb 25 Python
如何表示python中的相对路径
Jul 08 Python
OpenCV Python实现图像指定区域裁剪
Mar 12 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遍历数组的4种方法总结
2014/07/05 PHP
php类中的$this,static,final,const,self这几个关键字使用方法
2015/12/14 PHP
PHP基于DOM创建xml文档的方法示例
2017/02/08 PHP
PHP的mysqli_sqlstate()函数讲解
2019/01/23 PHP
JS操作XML中DTD介绍及使用方法分析
2019/07/04 PHP
asp.net和php的区别点总结
2019/10/10 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
JavaScript使用过程中需要注意的地方和一些基本语法
2010/08/26 Javascript
原生javascript实现无间缝滚动示例
2014/01/28 Javascript
jQuery简单图表peity.js使用示例
2014/05/02 Javascript
jquery实现左右无缝轮播图
2020/07/31 Javascript
浅谈MVC+EF easyui dataGrid 动态加载分页表格
2016/11/10 Javascript
微信小程序实现移动端滑动分页效果(ajax)
2017/06/13 Javascript
angular.js和vue.js中实现函数去抖示例(debounce)
2018/01/18 Javascript
js实现简单抽奖功能
2020/11/24 Javascript
python使用百度翻译进行中翻英示例
2014/04/14 Python
python difflib模块示例讲解
2017/09/13 Python
Python3导入自定义模块的三种方法详解
2018/04/13 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
Python实现密钥密码(加解密)实例详解
2020/04/26 Python
python右对齐的实例方法
2020/07/05 Python
HTML5之SVG 2D入门12—SVG DOM及DOM操作介绍
2013/01/30 HTML / CSS
移动端HTML5开发神器之vconsole详解
2020/12/15 HTML / CSS
亚历山大·王官网:Alexander Wang
2017/06/23 全球购物
迪奥官网:Dior.com
2018/12/04 全球购物
日本最佳原创设计品牌:Felissimo(芬理希梦)
2019/03/19 全球购物
Ibatis如何使用动态表名
2015/07/12 面试题
思想汇报范文
2013/11/04 职场文书
分家协议书
2014/04/21 职场文书
优秀员工推荐信
2014/05/10 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
安全承诺书
2015/01/19 职场文书
公司出差管理制度范本
2015/08/05 职场文书
合作协议书格式范本
2016/03/21 职场文书
详细介绍python类及类的用法
2021/05/31 Python
叶县这家生产军用电台的兵工厂,人称“四机部”,走出一上将
2022/02/18 无线电