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 相关文章推荐
合并Excel工作薄中成绩表的VBA代码,非常适合教育一线的朋友
Apr 09 Python
python抓取网页图片示例(python爬虫)
Apr 27 Python
举例详解Python中的split()函数的使用方法
Apr 07 Python
Python 列表(List) 的三种遍历方法实例 详解
Apr 15 Python
浅谈Python实现2种文件复制的方法
Jan 19 Python
对Python3 序列解包详解
Feb 16 Python
Python实现的旋转数组功能算法示例
Feb 23 Python
Python3+Requests+Excel完整接口自动化测试框架的实现
Oct 11 Python
解决jupyter notebook打不开无反应 浏览器未启动的问题
Apr 10 Python
Python ini文件常用操作方法解析
Apr 26 Python
keras中模型训练class_weight,sample_weight区别说明
May 23 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
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调用Linux的命令行执行文件压缩命令
2013/01/27 PHP
php实现跨域提交form表单的方法【2种方法】
2016/10/17 PHP
PHP实现上传图片到 zimg 服务器
2016/10/19 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
PHP设计模式之工厂模式(Factory Pattern)的讲解
2019/03/21 PHP
JS 的应用开发初探(mootools)
2009/12/19 Javascript
javascript中的对象创建 实例附注释
2011/02/08 Javascript
jQuery EasyUI API 中文文档 - Spinner微调器使用
2011/10/21 Javascript
javaScript NameSpace 简单说明介绍
2013/07/18 Javascript
JavaScript自定义方法实现trim()、Ltrim()、Rtrim()的功能
2013/11/03 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
JS开发中百度地图+城市联动实现实时触发查询地址功能
2017/04/13 Javascript
Vue shopCart 组件开发详解
2018/01/26 Javascript
ElementUI radio组件选中小改造
2019/08/12 Javascript
js实现课堂随机点名系统
2019/11/21 Javascript
vue实现登录拦截
2020/06/29 Javascript
python分析nignx访问日志脚本分享
2015/02/26 Python
在Linux下调试Python代码的各种方法
2015/04/17 Python
Python编程中运用闭包时所需要注意的一些地方
2015/05/02 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python简易计算器制作方法代码详解
2019/10/31 Python
python定时任务 sched模块用法实例
2019/11/04 Python
使用anaconda安装pytorch的实现步骤
2020/09/03 Python
在购买印度民族服饰:Soch
2020/09/15 全球购物
怎么写好自荐信
2013/10/30 职场文书
大学生毕业鉴定
2014/01/31 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
幼儿园老师寄语
2014/04/03 职场文书
公司承诺书怎么写
2014/05/24 职场文书
环境科学专业教师求职信
2014/07/12 职场文书
2014和解协议书范文
2014/09/15 职场文书
2014年保管员工作总结
2014/11/18 职场文书
2015年圣诞节活动总结
2015/03/24 职场文书
中学生勤俭节约倡议书
2015/04/29 职场文书
未婚证明范本
2015/06/15 职场文书