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中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
Python重新引入被覆盖的自带function
Jul 16 Python
利用python批量修改word文件名的方法示例
Oct 17 Python
Python进程间通信之共享内存详解
Oct 30 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
对tensorflow 的模型保存和调用实例讲解
Jul 28 Python
python爬取网易云音乐评论
Nov 16 Python
python3排序的实例方法
Oct 20 Python
在Python中字典按值排序的实现方法
Nov 12 Python
用Python远程登陆服务器的步骤
Apr 16 Python
如何在向量化NumPy数组上进行移动窗口
May 18 Python
Django操作cookie的实现
May 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 购物车实例(申精)
2009/05/11 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
腾讯CMEM的PHP扩展编译安装方法
2015/09/25 PHP
PHP从二维数组得到N层分类树的实现代码
2016/10/11 PHP
js活用事件触发对象动作
2008/08/10 Javascript
jquery实现图片翻页效果
2013/12/23 Javascript
有效提高JavaScript执行效率的几点知识
2015/01/31 Javascript
JavaScript从数组中删除指定值元素的方法
2015/03/18 Javascript
JS调用某段SQL语句的方法
2016/10/20 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
JavaScript实现定时页面跳转功能示例
2017/02/14 Javascript
Vue中添加过渡效果的方法
2017/03/16 Javascript
总结js中的一些兼容性易错的问题
2017/12/18 Javascript
浅谈vuex 闲置状态重置方案
2018/01/04 Javascript
微信小程序中使用Async-await方法异步请求变为同步请求方法
2019/03/28 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
ES5新增数组的实现方法
2020/05/12 Javascript
[27:53]2014 DOTA2华西杯精英邀请赛 5 24 NewBee VS iG
2014/05/26 DOTA
[03:02]2020完美世界城市挑战赛(秋季赛)总决赛回顾
2021/03/11 DOTA
python中self原理实例分析
2015/04/30 Python
Python如何实现守护进程的方法示例
2017/02/08 Python
Python温度转换实例分析
2018/01/17 Python
Python向Excel中插入图片的简单实现方法
2018/04/24 Python
OpenCV-Python 摄像头实时检测人脸代码实例
2019/04/30 Python
python装饰器练习题及答案
2019/11/01 Python
Python常用模块logging——日志输出功能(示例代码)
2019/11/20 Python
英国床垫在线:Mattress Online
2016/12/07 全球购物
Kathmandu英国网站:新西兰户外运动品牌
2017/03/27 全球购物
英国在线玫瑰专家:InterRose
2019/12/01 全球购物
药品促销活动方案
2014/02/14 职场文书
晚会主持词开场白
2014/03/17 职场文书
电力安全事故反思
2014/04/27 职场文书
坚守艰苦奋斗精神坚决反对享乐主义整改措施
2014/09/17 职场文书
企业年会祝酒词
2015/08/11 职场文书
彻底理解golang中什么是nil
2021/04/29 Golang
nginx刷新页面出现404解决方案(亲测有效)
2022/03/18 Servers