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 02 Python
Python3搜索及替换文件中文本的方法
May 22 Python
matplotlib在python上绘制3D散点图实例详解
Dec 09 Python
python正则中最短匹配实现代码
Jan 16 Python
django之对FileField字段的upload_to的设定方法
Jul 28 Python
Python+OpenCv制作证件图片生成器的操作方法
Aug 21 Python
python数据化运营的重要意义
Nov 25 Python
python颜色随机生成器的实例代码
Jan 10 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 Python
Python3爬虫关于识别检验滑动验证码的实例
Jul 30 Python
Python 可视化神器Plotly详解
Dec 26 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 反向排序和随机排序代码
2010/06/30 PHP
php一维二维数组键排序方法实例总结
2014/11/13 PHP
反射调用private方法实践(php、java)
2015/12/21 PHP
PHP实现模拟http请求的方法分析
2017/12/20 PHP
php异常处理捕获错误整理
2019/09/23 PHP
JObj预览一个JS的框架
2008/03/13 Javascript
网页自动跳转代码收集
2009/09/27 Javascript
javascript下对于事件、事件流、事件触发的顺序随便说说
2010/07/17 Javascript
一个JQuery写的点击上下滚动的小例子
2011/08/27 Javascript
js中更短的 Array 类型转换
2011/10/30 Javascript
基于JQuery模仿苹果桌面的Dock效果(初级版)
2012/10/15 Javascript
javascript操作select元素实例分析
2015/03/27 Javascript
Node.js编写组件的三种实现方式
2016/02/25 Javascript
JS简单验证上传文件类型的方法
2017/04/17 Javascript
详解React开发必不可少的eslint配置
2018/02/05 Javascript
微信小程序实现自上而下字幕滚动
2018/07/14 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
使用AutoJs实现微信抢红包的代码
2020/12/31 Javascript
在Python的web框架中编写创建日志的程序的教程
2015/04/30 Python
一篇文章入门Python生态系统(Python新手入门指导)
2015/12/11 Python
python监控linux内存并写入mongodb(推荐)
2017/09/11 Python
Python实现带参数与不带参数的多重继承示例
2018/01/30 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
详解如何设置Python环境变量?
2019/05/13 Python
python二分法查找算法实现方法【递归与非递归】
2019/12/06 Python
python 使用shutil复制图片的例子
2019/12/13 Python
如何在sublime编辑器中安装python
2020/05/20 Python
Staples加拿大官方网站:办公用品一站式采购
2016/09/25 全球购物
什么是索引指示器
2012/08/20 面试题
仓库组长岗位职责
2014/01/29 职场文书
求职意向书
2014/04/01 职场文书
服务型党组织建设典型材料
2014/05/07 职场文书
2014年数学教师工作总结
2014/12/03 职场文书
大学生受助感言
2015/08/01 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
mybatis 获取无数据的字段不显示的问题
2021/07/15 Java/Android