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的另外几种语言实现
Jan 29 Python
对于Python的Django框架部署的一些建议
Apr 09 Python
简单实现python爬虫功能
Dec 31 Python
Python实现堆排序的方法详解
May 03 Python
浅析AST抽象语法树及Python代码实现
Jun 06 Python
python实现给微信公众号发送消息的方法
Jun 30 Python
python实现报表自动化详解
Nov 16 Python
python读取excel指定列数据并写入到新的excel方法
Jul 10 Python
Python实现E-Mail收集插件实例教程
Feb 06 Python
python保留小数位的三种实现方法
Jan 07 Python
Python实现RabbitMQ6种消息模型的示例代码
Mar 30 Python
Python Selenium XPath根据文本内容查找元素的方法
Dec 07 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 stream_context_create()作用和用法分析
2011/03/29 PHP
php实现查询百度google收录情况(示例代码)
2013/08/02 PHP
如何使用微信公众平台开发模式实现多客服
2016/01/06 PHP
JavaScript获取GridView中用户点击控件的行号,列号
2009/04/14 Javascript
JavaScript DOM学习第四章 getElementByTagNames
2010/02/19 Javascript
jquery之超简单的div显示和隐藏特效demo(分享)
2013/07/09 Javascript
json数据与字符串的相互转化示例
2013/09/18 Javascript
Highcharts入门之基本属性
2016/08/02 Javascript
利用vue实现模态框组件
2016/12/19 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
微信小程序 聊天室简单实现
2017/04/19 Javascript
基于JavaScript表单脚本(详解)
2017/10/18 Javascript
Es6 Generator函数详细解析
2018/02/24 Javascript
Vue组件之极简的地址选择器的实现
2018/05/31 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
微信小程序实现列表滚动头部吸顶的示例代码
2020/07/12 Javascript
[45:52]2018DOTA2亚洲邀请赛 4.1小组赛 A组加赛 LGD vs Liquid
2018/04/02 DOTA
Python多线程下载文件的方法
2015/07/10 Python
总结python爬虫抓站的实用技巧
2016/08/09 Python
python图形工具turtle绘制国际象棋棋盘
2019/05/23 Python
python如何查看安装了的模块
2020/06/23 Python
HTML5 Video/Audio播放本地文件示例介绍
2013/11/18 HTML / CSS
Opodo英国旅游网站:预订廉价航班、酒店和汽车租赁
2018/07/14 全球购物
精选鞋类、服装和配饰的全球领先目的地:Bodega
2021/02/27 全球购物
DBA的职责都有哪些
2012/05/16 面试题
Why do we need Unit test
2013/01/03 面试题
电子信息毕业生自荐信
2013/11/16 职场文书
毕业生欢送会主持词
2014/03/31 职场文书
国企干部对照检查材料
2014/08/22 职场文书
村长反四风问题个人对照检查材料
2014/09/21 职场文书
个人优缺点总结
2015/02/28 职场文书
早会开场白台词大全
2015/06/01 职场文书
2015年幼儿园国庆节活动总结
2015/07/30 职场文书
孕妇病假条怎么写
2015/08/17 职场文书
victoriaMetrics库布隆过滤器初始化及使用详解
2022/04/05 Golang