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学习RabbitMQ消息队列
Nov 30 Python
Python实现时钟显示效果思路详解
Apr 11 Python
Python实现string字符串连接的方法总结【8种方式】
Jul 06 Python
Python装饰器语法糖
Jan 02 Python
使用python3构建文件传输的方法
Feb 13 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
Python tkinter三种布局实例详解
Jan 06 Python
Django接收照片储存文件的实例代码
Mar 07 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
Apr 17 Python
Python验证码截取识别代码实例
May 16 Python
完美解决pycharm 不显示代码提示问题
Jun 02 Python
详解pycharm的python包opencv(cv2)无代码提示问题的解决
Jan 29 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
我的论坛源代码(一)
2006/10/09 PHP
yii用户注册表单验证实例
2015/12/26 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
THINKPHP截取中文字符串函数实例代码
2017/03/20 PHP
jquery 元素控制(追加元素/追加内容)介绍及应用
2013/04/21 Javascript
js通过元素class名字获取元素集合的具体实现
2014/01/06 Javascript
Javascript 按位与赋值运算符 (&=)使用介绍
2014/02/04 Javascript
node.js中的fs.rmdir方法使用说明
2014/12/16 Javascript
jQuery中:last选择器用法实例
2014/12/30 Javascript
javascript生成不重复的随机数
2015/07/17 Javascript
jquery中的工具使用方法$.isFunction, $.isArray(), $.isWindow()
2015/08/09 Javascript
解决JavaScript数字精度丢失问题的方法
2015/12/03 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
Bootstrap的modal拖动效果
2016/12/25 Javascript
layer弹出层中H5播放器全屏出错的解决方法
2017/02/21 Javascript
基于bootstrap实现收缩导航条
2017/03/17 Javascript
js实现一个简单的数字时钟效果
2017/03/29 Javascript
小程序ios音频播放没声音问题的解决
2018/07/11 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
微信小程序websocket实现即时聊天功能
2019/05/21 Javascript
JavaScript点击按钮生成4位随机验证码
2021/01/28 Javascript
[01:38]完美世界DOTA2联赛(PWL)宣传片:第一站
2020/10/26 DOTA
[32:56]完美世界DOTA2联赛PWL S3 Rebirth vs CPG 第二场 12.11
2020/12/16 DOTA
Python实现基本数据结构中队列的操作方法示例
2017/12/04 Python
python实现淘宝购物系统
2019/10/25 Python
Python数据可视化:顶级绘图库plotly详解
2019/12/07 Python
python列表切片和嵌套列表取值操作详解
2020/02/27 Python
百思买加拿大:Best Buy Canada
2018/03/20 全球购物
Yummie官方网站:塑身衣和衣柜必需品
2019/10/29 全球购物
中式面点餐厅创业计划书
2014/01/29 职场文书
中专毕业生自我鉴定
2014/02/02 职场文书
服装设计师职业生涯规划范文
2014/02/28 职场文书
小学生春游活动方案
2014/08/20 职场文书
纪律教育学习月活动总结
2014/08/27 职场文书
暑期实践个人总结
2015/03/06 职场文书
python图像处理基本操作总结(PIL库、Matplotlib及Numpy)
2021/06/08 Python