并发编程之互斥锁

互斥锁

锁在IT界都是非常重要的,不但在Python中出现,尤其是数据库中得锁更多,
比如:表锁、行锁、悲观锁、乐观锁、进程锁、互斥锁、递归锁、可重入锁、死锁等。

互斥锁是什么?

将并发变成串行 虽然牺牲了程序的执行效率 但是保证了数据的安全

互斥锁概念

同一时间运行一个进程上一把锁,就是Lock。那么我们加锁的意义在哪呢?
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,
即串行的修改。虽然我们的程序运行速度是慢了,但牺牲速度却保证了数据安全

同一时间允许多个进程上多把锁 就是[信号量Semaphore]
信号量是锁的变形:实际实现是 计数器+锁,同时允许多个进程上锁

互斥锁的作用

互斥锁Lock:互斥锁就是进程的相互排斥
谁先抢到自由,谁就上锁该资源内容,这样做可以保证数据的同步性。
注意:多个锁一起上锁,不开锁会造成死锁,上锁和释放锁是一对

什么时候使用互斥锁

多个程序同时操作一份数据的时候容易产生数据错乱
为了避免数据错乱,我们需要使用互斥锁

如何使用互斥锁

如何使用?导入模块 form multiprocessing import Process,Locklock = Lock()   # 变量名创建一个锁lock.acquire()  # 上锁lock.release()  # 释放锁
上锁谁抢到谁使用,其他人等着使用完才能使用'''
锁相关的知识行锁:针对行数据加锁 同一时间只能一个人操作表锁:针对表数据加锁 同一时间只能一个人操作锁的应用范围很广 但是核心都是为了保证数据的安全!!!
'''

做一个简单案例试试

	'简单案例'
from multiprocessing import Process,Lock
import time
'''使用锁的目的就是为了保证安全'''
def task(i,lock):lock.acquire()  # 上锁print('进程%s进来了' % i)time.sleep(1)print('进程%s走了' % i)lock.release()  # 释放锁'''只要上锁了,就一定别忘了最后释放锁,否则的话,别的进程永远进不来''''''加上锁就一定好吗?虽然保证了数据的安全,但是呢执行效率降低了,所以只适用于相应适配的场景,'''# 使用锁就是为了安全
if __name__ == '__main__':lock = Lock()ll = []for i in range(3):p = Process(target=task,args =(i+1,lock))p.start()ll.append(p)for j in ll:j.join()print('主线程')

模拟简易版12306抢票、查票、买票

import time, random, json
from multiprocessing import Process, Lock
import multiprocessing
# 导入模块写入系统票数
pl = {'ticket_num':5}
with open(r'data.json','w',encoding='utf-8')as f:json.dump(pl,f,ensure_ascii=False)'查票'
def search(name):with open(r'data.json','r',encoding='utf-8')as f:data = json.load(f)print(f"{name}查看票,目前剩余:{data.get('ticket_num')}")'买票'
def buy(name):# 先查询票数with open(r'data.json','r',encoding='utf-8')as f:data = json.load(f)'模拟网络延迟'time.sleep(random.randint(1,3))  #'判断当前是否有票'if data.get('ticket_num') > 0:data['ticket_num'] -= 1with open(r'data.json','w',encoding='utf-8')as f1:json.dump(data,f1,ensure_ascii=False)print(f"{name}抢票成功!")else:print(f"{name}很抱歉暂无票了")def run(name):search(name)buy(name)if __name__ == '__main__':for i in range(10):p = Process(target=run,args=(f"用户{i}",))p.start()'''这里输出结果是10个人都抢到票了,所以在这种情况下我们就得用互斥锁!'''print('============以下使用了互斥锁的代码================')'查票'
def search(name):with open(r'data.json','r',encoding='utf-8')as f:data = json.load(f)print(f"{name}正在查票,当前剩余:{data.get('ticket_num')}张票")'买票'
def buy(name):# 需要先查询是否有票with open(r'data.json','r',encoding='utf-8')as f:data = json.load(f)# 模拟延迟time.sleep(random.randint(1,3))# 判断当前是否有票if data.get('ticket_num') > 0:data['ticket_num'] -= 1with open(r'data.json','w',encoding='utf-8')as f1:json.dump(data,f1,ensure_ascii=False)print(f"用户{name},购票成功!")else:print(f"用户{name},sorry,当前暂未有票哦")def run(name,lock):search(name)# 只需要把买票环节变成串行即可lock.acquire()  # 上锁buy(name)lock.release()  # 释放锁if __name__ == '__main__':'互斥锁在主进程中产生一把 交给多个子进程使用''''Lock互斥锁,进程之间数据是不共享的但是Lock对象底层是通过socket来互相发送数据,不管多少进程,都是同一个Lock锁'''lock = Lock()  # 创建一把锁for i in range(10):p = Process(target=run,args=(f"用户:{i}", lock))p.start()'''此时使用互斥锁就使有用户没有抢到票了'''

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/111166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RT thread 信号量操作

信号量控制 在RT-Thread 中&#xff0c;信号量控制块是操作系统用于管理信号量的一个数据结构。 struct rt_semaphore { struct rt_ipc_object parent; /**<inherit from ipc_object*/ rt_uint16_t value; /**<value of semaphore.*/ }定义静态信号量:struct rt_semaph…

五、K8S之Service

Kubernetes Service 一、概念 Deployment对象部署完应用还需要向外界暴露入口才能通过HTTP访问到K8S集群里的应用Pod。Service就是做这件事情的&#xff0c;为什么还需要一个这样的API对象&#xff0c;一个方面是因为Pod的IP不是固定的&#xff0c;另外一个方面是因为一组Pod…

Linux文件管理与用户管理

一、查看文件内容 1、回顾之前的命令 cat命令、tac命令、head命令、tail命令、扩展&#xff1a;tail -f动态查看一个文件的内容 2、more分屏显示文件内容&#xff08;了解&#xff09; 基本语法&#xff1a; # more 文件名称 特别注意&#xff1a;more命令在加载文件时并不…

【三:Mock服务的使用】

目录 1、工具包2、mock的demo1、get请求2、post请求3、带cookies的请求4、带请求头的请求5、请求重定向 1、工具包 1、&#xff1a;服务包的下载 moco-runner-0.11.0-standalone.jar 下载 2、&#xff1a;运行命令java -jar ./moco-runner-0.11.0-standalone.jar http -p 888…

2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析

摘要: 2023-10-17 mysql-innodb-解析write_row的record的一行数据-分析. record是一行数据的序列化后的一整个字节流, 在innodb中需要解读出字段. 本文分析如何解析record, 以便学习这种技巧. row_mysql_store_col_in_innobase_format 调用堆栈: #0 row_mysql_store_col_in…

边写代码边学习之mlflow

1. 简介 MLflow 是一个多功能、可扩展的开源平台&#xff0c;用于管理整个机器学习生命周期的工作流程和工件。 它与许多流行的 ML 库内置集成&#xff0c;但可以与任何库、算法或部署工具一起使用。 它被设计为可扩展的&#xff0c;因此您可以编写插件来支持新的工作流程、库和…

【算法学习】归并算法Merge Sort总结

归并排序思路简单&#xff0c;速度仅次于快速排序&#xff0c;为稳定排序算法&#xff0c;一般用于对总体无序&#xff0c;但是各子项相对有序的数列。 1. 基本思想 归并排序使用分治思想&#xff0c;分治模式下每一层递归有三个步骤&#xff1a; 分解&#xff08;divide)&a…

Git命令在线练习网址--非常友好的提示及动画展示

Git命令在线练习 https://learngitbranching.js.org/ 举个栗子: 在练习时会给你相应提示,你可以按照相应步骤进行操作,并且每一步都有动画演示

直播带货前途渺茫了

我是卢松松&#xff0c;点点上面的头像&#xff0c;欢迎关注我哦&#xff01; 种种迹象表明电商行业和直播带货将受到冲击。直播带货前途渺茫了&#xff0c;相信很快就有政策出来了&#xff0c;针对电商这块的&#xff0c;支持实体、支持取消直播带货。 (1)目前&#xff0c;…

display有哪些值?说明他们的作用?

display解析: display 属性用于控制元素的外部盒模型&#xff08;外观&#xff09;以及元素在文档中的布局。它有多个不同的值&#xff0c;每个值都会影响元素的呈现方式和行为。以下是一些常见的 display 属性值以及它们的作用&#xff1a; block&#xff08;块级元素&#x…

协同创新、奔赴未来——“华为云杯”2023人工智能创新应用大赛华丽谢幕

9月27日&#xff0c;在苏州工业园区管理委员会、华为云计算技术有限公司的指导下&#xff0c;由SISPARK&#xff08;苏州国际科技园&#xff09;、华为&#xff08;苏州&#xff09;人工智能创新中心联合主办&#xff0c;东北大学工业智能与系统优化国家级前沿科学中心、浙江大…

驱动:驱动相关概念,内核模块编程,内核消息打印printk函数的使用

一、驱动相关概念 1.操作系统的功能 向下管理硬件&#xff0c;向上提供接口 操作系统向上提供的接口类型&#xff1a; 内存管理&#xff1a;内存申请&#xff08;malloc&#xff09; 内存释放&#xff08;free&#xff09;等 文件管理&#xff1a; 通过文件系统格式对文件ext2…

E054-web安全应用-Brute force暴力破解进阶

课程名称&#xff1a; E054-web安全应用-Brute force暴力破解进阶 课程分类&#xff1a; web安全应用 实验等级: 中级 任务场景: 【任务场景】 小王接到磐石公司的邀请&#xff0c;对该公司旗下的网站进行安全检测&#xff0c;经过一番检查发现该网站可能存在弱口令漏洞…

​LeetCode解法汇总1726. 同积元组

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 描述&#xff1a; 给你一个由…

AAOS CarMediaService 服务框架

文章目录 前言MediaSessionCarMediaService作用是什么&#xff1f;提供了哪些接口&#xff1f;如何使用&#xff1f;CarMediaService的实现总结 前言 CarMediaService 是AAOS中统一管理媒体播放控制、信息显示和用户交互等功能的服务。这一服务依赖于android MediaSession框架…

搭建NGINX服务 如何统计网页访问量

一、搭建Nginx服务 搭建之前需要查看一下我们的内核数制 我们进行简单的内核优化 命令&#xff1a;ulimit -n 65535 安装Nginx服务 第一步 关闭防火墙和安全机制 systemctl stop firewalld #关闭防火墙 systemct disable firewalld #开机自动关闭防火墙 setenfor…

美创科技信创数据安全「利基者」!

近日&#xff0c;第一新声研究部正式发布《2023年中国信创网络安全产品竞争力象限》&#xff08;下称“象限报告“&#xff09;。 ◼︎ 象限报告综合考虑企业占有率、在技术/应用上的成熟度、在客户方面的交付完成度及口碑、产品在市场/营销/商业模式/行业拓展等战略上的领先性…

ES6 数组解构时不加分号引发的问题

问题代码 let value1 0 let value2 0 let value1_1 , value1_2 , value1_3 , value2_1, value2_2, value2_3function myhandle(cur, pre) {let s , c , r if (parseInt(cur) - parseInt(pre) < 0) {s -c decreaser Math.abs(parseInt(cur) - parseInt(pre))} el…

无人机新手防炸飞行技巧

不要在室内飞行,容易撞墙。起飞前设置好避障和返航模式。使用模拟器熟练掌握操控。选择开阔环境目视起飞。使用低速档平稳飞行。合理使用避障功能,不要盲目依赖。使用九宫格避障法。留意电量,及时返航。极低电量时放弃强行返航。飞行后及时为电池充电保养。

文件管理系统的基本认识

1.文件的属性 文件的定义:一组有意义的信息的集合。 1.文件名: 由创建文件的用户决定文件名&#xff0c;主要是为了方便用户找到文件&#xff0c;同一目录下不允许有重名文件。 2.标识符: 一个系统内的各文件标识符唯一&#xff0c;对用户来说毫无可读性&#xff0c; 因此…