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 socket 超时设置 errno 10054
Jul 01 Python
python在linux系统下获取系统内存使用情况的方法
May 11 Python
python实现日常记账本小程序
Mar 10 Python
PyQt5实现拖放功能
Apr 25 Python
python微信好友数据分析详解
Nov 19 Python
Django 日志配置按日期滚动的方法
Jan 31 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
Pycharm 2019 破解激活方法图文详解
Oct 11 Python
python对指定字符串逆序的6种方法(小结)
Apr 02 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 Python
django中嵌套的try-except实例
May 21 Python
tensorflow实现残差网络方式(mnist数据集)
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 MySQL与分页效率
2008/06/04 PHP
PHP设置一边执行一边输出结果的代码
2013/09/30 PHP
PHP提示Deprecated: mysql_connect(): The mysql extension is deprecated的解决方法
2014/08/28 PHP
apache中为php 设置虚拟目录
2014/12/17 PHP
CI框架中site_url()和base_url()的区别
2015/01/07 PHP
php的PDO事务处理机制实例分析
2017/02/16 PHP
PHP htmlspecialchars_decode()函数用法讲解
2019/03/01 PHP
实例化php类时传参的方法分析
2020/06/05 PHP
如何在Web页面上直接打开、编辑、创建Office文档
2007/03/12 Javascript
jQuery 方法大全方便学习参考
2010/02/25 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
用javascript关闭本窗口不弹出询问框的方法
2014/09/12 Javascript
js表头排序实现方法
2015/01/16 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
js 自带的 map() 方法全面了解
2016/08/16 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
2017/04/13 Javascript
基于AngularJS的拖拽文件上传的实例代码
2017/07/15 Javascript
vue工程全局设置ajax的等待动效的方法
2019/02/22 Javascript
three.js 将图片马赛克化的示例代码
2020/07/31 Javascript
ant design 日期格式化的实现
2020/10/27 Javascript
[49:08]OpTic vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
Python 3实战爬虫之爬取京东图书的图片详解
2017/10/09 Python
python实现批量图片格式转换
2020/06/16 Python
django之状态保持-使用redis存储session的例子
2019/07/28 Python
tensorflow 2.1.0 安装与实战教程(CASIA FACE v5)
2020/06/30 Python
Pycharm 解决自动格式化冲突的设置操作
2021/01/15 Python
利用python实现汉诺塔游戏
2021/03/01 Python
CSS3 文字动画效果
2020/11/12 HTML / CSS
Html5剪切板功能的实现代码
2018/06/29 HTML / CSS
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
中专自荐信
2013/10/13 职场文书
企业安全生产责任书
2014/04/14 职场文书
车辆工程专业求职信
2014/04/28 职场文书
社团招新宣传语
2015/07/13 职场文书
Python实现信息轰炸工具(再也不怕说不过别人了)
2021/06/11 Python