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实例分析
May 20 Python
Python实现数据库并行读取和写入实例
Jun 09 Python
Python简单生成随机姓名的方法示例
Dec 27 Python
使用Python读取大文件的方法
Feb 11 Python
Python使用try except处理程序异常的三种常用方法分析
Sep 05 Python
Python 中Django安装和使用教程详解
Jul 03 Python
详解Python是如何实现issubclass的
Jul 24 Python
python实现对服务器脚本敏感信息的加密解密功能
Aug 13 Python
超实用的 30 段 Python 案例
Oct 10 Python
python实现简单图书管理系统
Nov 22 Python
python不相等的两个字符串的 if 条件判断为True详解
Mar 12 Python
解决Pytorch dataloader时报错每个tensor维度不一样的问题
May 28 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 mysql数据库操作分页类
2008/06/04 PHP
PHP程序开发范例学习之表单 获取文本框的值
2011/08/08 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
javascript 关闭IE6、IE7
2009/06/01 Javascript
jquery判断字符输入个数(数字英文长度记为1,中文记为2,超过长度自动截取)
2010/10/15 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
toggle()隐藏问题的解决方法
2014/02/17 Javascript
微信小程序 Flex布局详解
2016/10/09 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
JS实现超简单的汉字转拼音功能示例
2016/12/22 Javascript
HTML5 js实现拖拉上传文件功能
2020/11/20 Javascript
jQuery实现元素的插入
2017/02/27 Javascript
详解nodejs异步I/O和事件循环
2017/06/07 NodeJs
JSON是什么?有哪些优点?JSON和XML的区别?
2019/04/29 Javascript
vue实现条件叠加搜索的解决方法
2019/05/28 Javascript
[00:36]DOTA2风云人物相约完美“圣”典 12月17日不见不散
2016/11/30 DOTA
python模拟enum枚举类型的方法小结
2015/04/30 Python
Python在Console下显示文本进度条的方法
2016/02/14 Python
Python实现模拟登录网易邮箱的方法示例
2018/07/05 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python3.4 将16进制转成字符串的实例
2019/06/12 Python
Python脚本操作Excel实现批量替换功能
2019/11/20 Python
Python 读取 YUV(NV12) 视频文件实例
2019/12/09 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
python如何支持并发方法详解
2020/07/25 Python
HTML5 video视频字幕的使用和制作方法
2018/05/03 HTML / CSS
Html5 Canvas实现图片标记、缩放、移动和保存历史状态功能 (附转换公式)
2020/03/18 HTML / CSS
idealfit英国:世界领先的女性健身用品和运动衣物品牌
2017/11/25 全球购物
高中生的学习总结自我鉴定
2013/10/26 职场文书
市场部管理制度
2014/02/02 职场文书
公司经理聘任书
2014/03/29 职场文书
环保倡议书怎么写
2014/05/16 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
创业计划书详解
2019/07/19 职场文书
JavaScript实现栈结构详细过程
2021/12/06 Javascript
如何避免mysql启动时错误及sock文件作用分析
2022/01/22 MySQL