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基础教程之Hello World!
Aug 29 Python
python自动zip压缩目录的方法
Jun 28 Python
Python中struct模块对字节流/二进制流的操作教程
Jan 21 Python
Python使用cx_Oracle调用Oracle存储过程的方法示例
Oct 07 Python
Python实现可自定义大小的截屏功能
Jan 20 Python
python字符串循环左移
Mar 08 Python
Python 使用 PyMysql、DBUtils 创建连接池提升性能
Aug 14 Python
Pycharm创建项目时如何自动添加头部信息
Nov 14 Python
python语言实现贪吃蛇游戏
Nov 13 Python
详解Python常用的魔法方法
Jun 03 Python
python识别围棋定位棋盘位置
Jul 26 Python
Python中的变量与常量
Nov 11 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的socket实现客户端到服务端的通信实例详解
2017/02/04 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
D3.js中data(), enter() 和 exit()的问题详解
2015/08/17 Javascript
JS中artdialog弹出框控件之提交表单思路详解
2016/04/18 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
jquery+ajax+text文本框实现智能提示完整实例
2016/07/09 Javascript
利用bootstrapValidator验证UEditor
2016/09/14 Javascript
jQuery实现导航滚动到指定内容效果完整实例【附demo源码下载】
2016/09/20 Javascript
bootstrap实现图片自动轮播
2016/12/21 Javascript
使用vue.js编写蓝色拼图小游戏
2017/03/17 Javascript
浅谈vue实现数据监听的函数 Object.defineProperty
2017/06/08 Javascript
Thinkjs3新手入门之如何使用静态资源目录
2017/12/06 Javascript
详解封装基础的angular4的request请求方法
2018/06/05 Javascript
vue+axios+mock.js环境搭建的方法步骤
2018/08/28 Javascript
为jquery的ajax请求添加超时timeout时间的操作方法
2018/09/04 jQuery
vue项目打包之后背景样式丢失的解决方案
2019/01/17 Javascript
JavaScript对JSON数组简单排序操作示例
2019/01/31 Javascript
在JavaScript中使用严格模式(Strict Mode)
2019/06/13 Javascript
vue点击Dashboard不同内容 跳转到同一表格的实例
2020/11/13 Javascript
在Python中使用CasperJS获取JS渲染生成的HTML内容的教程
2015/04/09 Python
python使用wxpython开发简单记事本的方法
2015/05/20 Python
python+django快速实现文件上传
2016/10/24 Python
Python面向对象程序设计OOP入门教程【类,实例,继承,重载等】
2019/01/05 Python
Pandas之DataFrame对象的列和索引之间的转化
2019/06/25 Python
python 设置xlabel,ylabel 坐标轴字体大小,字体类型
2019/07/23 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
如何查看浏览器对html5的支持情况
2020/12/15 HTML / CSS
KIKO MILANO英国官网:意大利知名化妆品和护肤品品牌
2017/09/25 全球购物
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
Marlies Dekkers内衣法国官方网上商店:国际知名的荷兰内衣品牌
2019/03/18 全球购物
营销与策划专业求职信
2014/06/20 职场文书
建议书范文
2015/02/05 职场文书
小学生交通安全寄语
2015/02/27 职场文书
Python中Matplotlib的点、线形状、颜色以及绘制散点图
2022/04/07 Python
python运行脚本文件的三种方法实例
2022/06/25 Python
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers