锁机制,信号机制,事件机制
一.锁机制
程序加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全
multiprocessing模块提供基于消息的ipc通信机制:队列和管道
l = Lock()
l.acquire() 锁,别的程序无法操作
l.release()开锁,允许别的进程操作
模拟抢票
#文件db的内容为:{"count":1} #注意一定要用双引号,不然json无法识别 #并发运行,效率高,但竞争写同一文件,数据写入错乱 from multiprocessing import Process,Lock import time,json,random def search():dic=json.load(open('db'))print('\033[43m剩余票数%s\033[0m' %dic['count'])def get():dic=json.load(open('db'))time.sleep(0.1) #模拟读数据的网络延迟if dic['count'] >0:dic['count']-=1time.sleep(0.2) #模拟写数据的网络延迟json.dump(dic,open('db','w'))print('\033[43m购票成功\033[0m')def task():search()get()if __name__ == '__main__':for i in range(100): #模拟并发100个客户端抢票p=Process(target=task)p.start()多进程同时抢购余票
多进程同时抢购余票
#文件db的内容为:{"count":5} #注意一定要用双引号,不然json无法识别 #并发运行,效率高,但竞争写同一文件,数据写入错乱 from multiprocessing import Process,Lock import time,json,random def search():dic=json.load(open('db'))print('\033[43m剩余票数%s\033[0m' %dic['count'])def get():dic=json.load(open('db'))time.sleep(random.random()) #模拟读数据的网络延迟if dic['count'] >0:dic['count']-=1time.sleep(random.random()) #模拟写数据的网络延迟json.dump(dic,open('db','w'))print('\033[32m购票成功\033[0m')else:print('\033[31m购票失败\033[0m')def task(lock):search()lock.acquire()get()lock.release()if __name__ == '__main__':lock = Lock()for i in range(100): #模拟并发100个客户端抢票p=Process(target=task,args=(lock,))p.start()使用锁来保证数据安全
使用锁来保证数据安全
二.信号量
sem = Semphore(3) 3表示可以有3个进程同时进行操作数据,而后面的进程必须等待前面的进程结束才可以进行
例
from multiprocessing import Process,Semaphore import time,randomdef go_ktv(sem,user):sem.acquire()print('%s 占到一间ktv小屋' %user)time.sleep(random.randint(0,3)) #模拟每个人在ktv中待的时间不同 sem.release()if __name__ == '__main__':sem=Semaphore(4)p_l=[]for i in range(13):p=Process(target=go_ktv,args=(sem,'user%s' %i,))p.start()p_l.append(p)for i in p_l:i.join()print('============》')例子
三.事件
e = Event
四个方法 : e.set() 修改e.is_set为True e.clear修改e.is_set为False e.wait() 判断e.is_set是True还是
False,True继续执行 False就会停止
python线程的事件用于主线程控制其他线程的执行,事件主要提供了三个方法 set wait clear
事件处理的机制:全局定义了一个'Flag',如果'Flag'值为 False,那么当程序执行event.wait 方法时就会阻塞,如果'Flag'值为True,那么event.wait方法时便不再阻塞
clear:将'Flag'设置为False
set:将'Flag'设置为True
from multiprocessing import Process, Event import time, randomdef car(e, n):while True:if not e.is_set(): # 进程刚开启,is_set()的值是Flase,模拟信号灯为红色print('\033[31m红灯亮\033[0m,car%s等着' % n)e.wait() # 阻塞,等待is_set()的值变成True,模拟信号灯为绿色print('\033[32m车%s 看见绿灯亮了\033[0m' % n)time.sleep(random.randint(3, 6))if not e.is_set(): #如果is_set()的值是Flase,也就是红灯,仍然回到while语句开始continueprint('车开远了,car', n)breakdef police_car(e, n):while True:if not e.is_set():# 进程刚开启,is_set()的值是Flase,模拟信号灯为红色print('\033[31m红灯亮\033[0m,car%s等着' % n)e.wait(0.1) # 阻塞,等待设置等待时间,等待0.1s之后没有等到绿灯就闯红灯走了if not e.is_set():print('\033[33m红灯,警车先走\033[0m,car %s' % n)else:print('\033[33;46m绿灯,警车走\033[0m,car %s' % n)breakdef traffic_lights(e, inverval):while True:time.sleep(inverval)if e.is_set():print('######', e.is_set())e.clear() # ---->将is_set()的值设置为Falseelse:e.set() # ---->将is_set()的值设置为Trueprint('***********',e.is_set())if __name__ == '__main__':e = Event()for i in range(10):p=Process(target=car,args=(e,i,)) # 创建是个进程控制10辆车 p.start()for i in range(5):p = Process(target=police_car, args=(e, i,)) # 创建5个进程控制5辆警车 p.start()t = Process(target=traffic_lights, args=(e, 10)) # 创建一个进程控制红绿灯 t.start()print('============》')红绿灯实例
转载于:https://www.cnblogs.com/wangjian941118/p/9513333.html
锁机制,信号机制,事件机制相关推荐
- Python下进程同步之互斥锁、信号量、事件机制
链接:https://blog.csdn.net/qq_41964425/article/details/81911343
- jQuery中的事件机制与DOM操作
jQuery事件机制 jQuery的事件机制,指的是jQuery对JavaScript操作DOM事件的封装,包括了:事件绑定.事件解绑.事件触发. 下面我们先来回顾一下事件的几种类型. 事件 描述 c ...
- Spring的事件机制
Spring的事件机制 Spring的事件机制 自定义一个事件 发布一个事件 监听器 深入Spring源码 Spring的事件机制 自定义一个事件 通过继承ApplicationEvent自定义事件 ...
- python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用
详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...
- 深入剖析WebRTC事件机制之Sigslot
前言 我最早了解到 sigslot 大概是在 2007年 左右,当时在QT中大量使用了 sigslot 的概念. 现在 WebRTC 中也大量使用了 sigslot 这种机制来处理底层的事件.它对我们 ...
- QT 的信号与槽机制介绍
QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...
- 9.QT事件机制源码时序分析(上)
通过上两篇博客https://blog.csdn.net/Master_Cui/article/details/109093845和https://blog.csdn.net/Master_Cui/a ...
- linux信号(signal) 机制分析
1 信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. ...
- qt学习之路3 ---信号与槽机制
信号和槽机制 1.概述 Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制.信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object ...
- pyqt 槽任意参数_PyQt5信号与槽机制入门(一)
信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.当事件或者状态发生改变时,就会发出信号,信号会触发所有与这个事件(信号)相关的函数(槽):一个信号可 ...
最新文章
- 学历高的人,喜欢关注什么?
- qregexp限制数字范围_计算一列数字的平均值
- mysql常用命令,mysql语法,mysql登陆、创建数据库、创建用户、更改密码、为用户授权...
- 超细节!从源代码剖析Self-Attention知识点
- 用python输出回文数
- HTML用户点击新建按钮,html – 需要点击按钮
- 用汇编的眼光看C++(之算术符重载陷阱)
- NP-Hard问题浅谈
- 声纹识别demo_科学网—声纹识别、说话人识别软件,SPEAKER v0.1 - 石自强的博文...
- 三维建模软件有哪些?超详细三维建模软件介绍
- 压缩文件的格式zip和rar有什么区别?
- 中企海外周报 | 华为在德国发布mate30系列手机;一汽新车亮相法兰克福车展
- 计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系
- 描述十二个异性追求者的拓展
- 由frankmocap得到的.pkl文件转为.bvh或者.fbx
- 【5年Android从零复盘系列之十七】Android自定义View(12):手势绘制及GestureOverlayView事件详解(图文)
- Linux——操作系统安装
- Gateway+Nacos+Sleuth+Zipkin网关链路追踪(测试及源码),Gateway+FeignClient+Nacos通过网关远程调用微服务(一)
- 公司开除并在离职证明上贬低被程序员怒怼,网友:总有耿直的员工
- 优雅的二维数组循环赋值
热门文章
- java super.参数,Java super和this的对比及使用
- php之使用curl对百度orc进行文字识别(二维码识别同理)--base64编码方式(解决image format error)
- Spring Boot @ServletComponentScan 扫描 @WebServlet、@WebFilter、@WebListener
- LayaAir 缓动动画
- 数据库索引介绍及使用
- python3 下载网络图片
- 阶段3 2.Spring_02.程序间耦合_2 编译期依赖
- oracle中使用java存贮过程
- ubuntu 16.04 + zabbix 3.4 + postgresql shell
- flask使用配置文件