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 Django使用forms来实现评论功能
Aug 17 Python
python 网络编程常用代码段
Aug 28 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
windows环境下tensorflow安装过程详解
Mar 30 Python
简单实现python数独游戏
Mar 30 Python
解决Django数据库makemigrations有变化但是migrate时未变动问题
May 30 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
在django中查询获取数据,get, filter,all(),values()操作
Aug 09 Python
浅谈Python __init__.py的作用
Oct 28 Python
Pycharm创建文件时自动生成文件头注释(自定义设置作者日期)
Nov 24 Python
浅谈pytorch中的dropout的概率p
May 27 Python
Python Matplotlib库实现画局部图
Nov 17 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
利用Ffmpeg获得flv视频缩略图和视频时间的代码
2011/09/15 PHP
php中文乱码怎么办如何让浏览器自动识别utf-8
2014/01/15 PHP
Drupal7中常用的数据库操作实例
2014/03/02 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
PHP实现登录验证码校验功能
2018/05/17 PHP
根据一段代码浅谈Javascript闭包
2010/12/14 Javascript
改善用户体验的五款jQuery插件分享
2011/05/22 Javascript
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
jQuery的animate函数实现图文切换动画效果
2015/05/03 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
JavaScript 通过Ajax 动态加载CheckBox复选框
2017/08/31 Javascript
详解require.js配置路径的用法和css的引入
2017/09/06 Javascript
jQuery创建及操作xml格式数据示例
2018/05/26 jQuery
vue-quill-editor+plupload富文本编辑器实例详解
2018/10/19 Javascript
如何优雅地在Node应用中进行错误异常处理
2019/11/25 Javascript
vue实现动态表格提交参数动态生成控件的操作
2020/11/09 Javascript
[56:35]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第二局
2016/02/27 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
Python实现远程调用MetaSploit的方法
2014/08/22 Python
python递归计算N!的方法
2015/05/05 Python
Python3使用requests包抓取并保存网页源码的方法
2016/03/15 Python
python利用拉链法实现字典方法示例
2017/03/25 Python
Sanic框架配置操作分析
2018/07/17 Python
python paramiko利用sftp上传目录到远程的实例
2019/01/03 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
python logging添加filter教程
2019/12/24 Python
使用Django xadmin 实现修改时间选择器为不可输入状态
2020/03/30 Python
python和php哪个更适合写爬虫
2020/06/22 Python
PyCharm中关于安装第三方包的三个建议
2020/09/17 Python
Python如何使用ElementTree解析xml
2020/10/12 Python
波兰在线杂货店:Polski Koszyk
2019/11/02 全球购物
商务经理岗位职责
2014/07/30 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
贴吧吧主申请感言
2015/08/03 职场文书
Java实现给Word文件添加文字水印
2022/02/15 Java/Android