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实现udp数据报传输的方法
Sep 26 Python
详解python时间模块中的datetime模块
Jan 13 Python
Python图形绘制操作之正弦曲线实现方法分析
Dec 25 Python
对python中两种列表元素去重函数性能的比较方法
Jun 29 Python
机器学习实战之knn算法pandas
Jun 22 Python
python使用装饰器作日志处理的方法
Jul 11 Python
在python中用print()输出多个格式化参数的方法
Jul 16 Python
在Python中使用K-Means聚类和PCA主成分分析进行图像压缩
Apr 10 Python
Jupyter notebook如何修改平台字体
May 13 Python
Python调用REST API接口的几种方式汇总
Oct 19 Python
Python List remove()实例用法详解
Aug 02 Python
Python Matplotlib绘制两个Y轴图像
Apr 13 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中Array2xml类实现数组转化成XML实例
2014/12/08 PHP
PHP获取昨天、今天及明天日期的方法
2016/02/03 PHP
PHP生成静态HTML文档实现代码
2016/06/23 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
2016/09/30 PHP
laravel框架实现后台登录、退出功能示例
2019/10/31 PHP
jQuery select操作控制方法小结
2010/05/26 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
AngularJS基础知识
2014/12/21 Javascript
jQuery源码解读之hasClass()方法分析
2015/02/20 Javascript
高性能JavaScript DOM编程(1)
2015/08/11 Javascript
用JavaScript动态建立或增加CSS样式表的实现方法
2016/05/20 Javascript
javascript中使用未定义变量或值的情况分析
2016/07/19 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
微信小程序开发(二)图片上传+服务端接收详解
2017/01/11 Javascript
angular 基于ng-messages的表单验证实例
2017/05/04 Javascript
React.js绑定this的5种方法(小结)
2018/06/05 Javascript
React styled-components设置组件属性的方法
2018/08/07 Javascript
vue(2.x,3.0)配置跨域代理
2019/11/27 Javascript
微信小程序搜索框样式并实现跳转到搜索页面(小程序搜索功能)
2020/03/10 Javascript
jQuery 淡入/淡出效果函数用法分析
2020/05/19 jQuery
使用eslint和githooks统一前端风格的技巧
2020/07/29 Javascript
利用JavaScript模拟京东按键输入功能
2020/12/01 Javascript
JavaScript函数柯里化实现原理及过程
2020/12/02 Javascript
Vue 实现可视化拖拽页面编辑器
2021/02/01 Vue.js
[19:26]TNC vs EG (BO3)
2018/06/07 DOTA
Python random模块制作简易的四位数验证码
2020/02/01 Python
Kears 使用:通过回调函数保存最佳准确率下的模型操作
2020/06/17 Python
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
超市中秋节促销方案
2014/03/21 职场文书
我的梦中国梦演讲稿
2014/04/23 职场文书
班级学习计划书
2014/04/27 职场文书
纪检监察建议书
2014/05/19 职场文书
处级干部考察材料
2014/12/24 职场文书
新郎婚礼答谢词
2015/01/04 职场文书
楚门的世界观后感
2015/06/03 职场文书