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中为什么要用self探讨
Apr 14 Python
举例讲解Python编程中对线程锁的使用
Jul 12 Python
python 读写、创建 文件的方法(必看)
Sep 12 Python
Python编程实现蚁群算法详解
Nov 13 Python
Python的numpy库中将矩阵转换为列表等函数的方法
Apr 04 Python
python实现排序算法解析
Sep 08 Python
解决python os.mkdir创建目录失败的问题
Oct 16 Python
Python3如何对urllib和urllib2进行重构
Nov 25 Python
pytorch 模拟关系拟合——回归实例
Jan 14 Python
python实现简单颜色识别程序
Feb 19 Python
TensorFlow保存TensorBoard图像操作
Jun 23 Python
简单谈谈Python面向对象的相关知识
Jun 28 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
做个自己站内搜索引擎
2006/10/09 PHP
浅析PHP的ASCII码转换类
2013/07/05 PHP
ThinkPHP中数据操作案例分析
2015/09/27 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
JavaScript 计算图片加载数量的代码
2011/01/01 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
JS链式调用的实现方法
2013/03/07 Javascript
node.js中的fs.ftruncate方法使用说明
2014/12/15 Javascript
JS实现重新加载当前页面
2016/11/29 Javascript
微信小程序开发经验总结(推荐)
2017/01/11 Javascript
Angular 4依赖注入学习教程之Injectable装饰器(六)
2017/06/04 Javascript
JavaScript页面加载事件实例讲解
2019/09/01 Javascript
layui监听下拉选框选中值变化的方法(包含监听普通下拉选框)
2019/09/24 Javascript
不刷新网页就能链接新的js文件方法总结
2020/03/01 Javascript
vue瀑布流组件实现上拉加载更多
2020/03/10 Javascript
[01:07:19]2018DOTA2亚洲邀请赛 4.5 淘汰赛 Mineski vs VG 第一场
2018/04/06 DOTA
python中将字典形式的数据循环插入Excel
2018/01/16 Python
python实现对csv文件的列的内容读取
2018/07/04 Python
详解Python打包分发工具setuptools
2019/08/05 Python
Django 项目重命名的实现步骤解析
2019/08/14 Python
解决django的template中如果无法引用MEDIA_URL问题
2020/04/07 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
使用python批量修改XML文件中图像的depth值
2020/07/22 Python
深入了解Python 变量作用域
2020/07/24 Python
css3中flex布局宽度不生效的解决
2020/12/09 HTML / CSS
联想西班牙官网:Lenovo西班牙
2018/08/28 全球购物
普通PHP程序员笔试题
2016/01/01 面试题
一套带答案的C++笔试题
2014/01/10 面试题
初中生自我评价
2014/02/01 职场文书
《植物妈妈有办法》教学反思
2014/02/25 职场文书
求职自荐信怎么写
2014/03/06 职场文书
出差报告范文
2014/11/06 职场文书
导游词之南京汤山温泉
2019/11/26 职场文书
MySQL 自定义变量的概念及特点
2021/05/13 MySQL
Python将CSV文件转化为HTML文件的操作方法
2021/06/30 Python