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 文件与目录操作
Dec 24 Python
使用Python的Django框架结合jQuery实现AJAX购物车页面
Apr 11 Python
Python出现segfault错误解决方法
Apr 16 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
对python中的six.moves模块的下载函数urlretrieve详解
Dec 19 Python
Python 做曲线拟合和求积分的方法
Dec 29 Python
Python3标准库总结
Feb 19 Python
django用户登录验证的完整示例代码
Jul 21 Python
python打造爬虫代理池过程解析
Aug 15 Python
Django Haystack 全文检索与关键词高亮的实现
Feb 17 Python
DjangoWeb使用Datatable进行后端分页的实现
May 18 Python
如何利用Python matplotlib绘制雷达图
Dec 21 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程序员工具
2008/05/26 PHP
php5.3 废弃函数小结
2010/05/16 PHP
判断php数组是否为索引数组的实现方法
2013/06/13 PHP
关于PHP模板Smarty的初级使用方法以及心得分享
2013/06/21 PHP
PHP中array_slice函数用法实例详解
2014/11/25 PHP
windows平台中配置nginx+php环境
2015/12/06 PHP
PHP实现根据时间戳获取周几的方法
2016/02/26 PHP
详解laravel passport OAuth2.0的4种模式
2019/11/04 PHP
JS input文本框禁用右键和复制粘贴功能的代码
2010/04/15 Javascript
json对象转字符串如何实现
2012/12/02 Javascript
JavaScript中“+”的陷阱深刻理解
2012/12/04 Javascript
javascript数据结构之二叉搜索树实现方法
2015/11/25 Javascript
深入理解JS函数的参数(arguments)的使用
2016/05/28 Javascript
AngularJS 实现JavaScript 动画效果详解
2016/09/08 Javascript
利用Vue.js框架实现火车票查询系统(附源码)
2017/02/27 Javascript
js实现旋转木马效果
2017/03/17 Javascript
微信小程序 input输入及动态设置按钮的实现
2017/10/27 Javascript
JavaScript实现封闭区域布尔运算的示例代码
2018/06/25 Javascript
js实现全选反选不选功能代码详解
2019/04/24 Javascript
基于jquery实现的tab选项卡功能示例【附源码下载】
2019/06/10 jQuery
[03:08]迎霜节狂欢!2018年迎霜节珍藏Ⅰ一览
2018/12/25 DOTA
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
python中MethodType方法介绍与使用示例
2017/08/03 Python
Python 从相对路径下import的方法
2018/12/04 Python
python找出因数与质因数的方法
2019/07/25 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
Python logging模块原理解析及应用
2020/08/13 Python
贝佳斯官方网站:Borghese
2020/05/08 全球购物
开水果连锁店创业计划书
2013/12/29 职场文书
事业单位辞职信范文
2014/01/19 职场文书
创先争优制度
2014/01/21 职场文书
《夹竹桃》教学反思
2014/04/20 职场文书
推广普通话演讲稿
2014/05/23 职场文书
新学期开学演讲稿
2014/05/24 职场文书
员工薪酬激励方案
2014/06/13 职场文书
Python Pytorch查询图像的特征从集合或数据库中查找图像
2022/04/09 Python