一.锁机制

程序加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全

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

锁机制,信号机制,事件机制相关推荐

  1. Python下进程同步之互斥锁、信号量、事件机制

    链接:https://blog.csdn.net/qq_41964425/article/details/81911343

  2. jQuery中的事件机制与DOM操作

    jQuery事件机制 jQuery的事件机制,指的是jQuery对JavaScript操作DOM事件的封装,包括了:事件绑定.事件解绑.事件触发. 下面我们先来回顾一下事件的几种类型. 事件 描述 c ...

  3. Spring的事件机制

    Spring的事件机制 Spring的事件机制 自定义一个事件 发布一个事件 监听器 深入Spring源码 Spring的事件机制 自定义一个事件 通过继承ApplicationEvent自定义事件 ...

  4. python 线程安全的数据类型_详解python多线程、锁、event事件机制的简单使用

    详解python多线程.锁.event事件机制的简单使用 发布时间:2020-09-25 02:04:12 来源:脚本之家 阅读:117 作者:君惜 线程和进程 1.线程共享创建它的进程的地址空间,进 ...

  5. 深入剖析WebRTC事件机制之Sigslot

    前言 我最早了解到 sigslot 大概是在 2007年 左右,当时在QT中大量使用了 sigslot 的概念. 现在 WebRTC 中也大量使用了 sigslot 这种机制来处理底层的事件.它对我们 ...

  6. QT 的信号与槽机制介绍

    QT 是一个跨平台的 C++ GUI 应用构架,它提供了丰富的窗口部件集,具有面向对象.易于扩展.真正的组件编程等特点,更为引人注目的是目前 Linux 上最为流行的 KDE 桌面环境就是建立在 QT ...

  7. 9.QT事件机制源码时序分析(上)

    通过上两篇博客https://blog.csdn.net/Master_Cui/article/details/109093845和https://blog.csdn.net/Master_Cui/a ...

  8. linux信号(signal) 机制分析

    1       信号本质 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器收到一个中断请求可以说是一样的. ...

  9. qt学习之路3 ---信号与槽机制

    信号和槽机制 1.概述 Qt采用了一种全新的对象和方法的关联与通信机制,称为信号和槽机制.信号和槽机制是独立于标准C++编译器的,在编译之前需要经过Qt的专门预处理工具MOC(Meta Object ...

  10. pyqt 槽任意参数_PyQt5信号与槽机制入门(一)

    信号(Signal)与槽(Slot)是Qt中的核心机制,也是在PyQt编程中对象之间进行通信的机制.当事件或者状态发生改变时,就会发出信号,信号会触发所有与这个事件(信号)相关的函数(槽):一个信号可 ...

最新文章

  1. 学历高的人,喜欢关注什么?
  2. qregexp限制数字范围_计算一列数字的平均值
  3. mysql常用命令,mysql语法,mysql登陆、创建数据库、创建用户、更改密码、为用户授权...
  4. 超细节!从源代码剖析Self-Attention知识点
  5. 用python输出回文数
  6. HTML用户点击新建按钮,html – 需要点击按钮
  7. 用汇编的眼光看C++(之算术符重载陷阱)
  8. NP-Hard问题浅谈
  9. 声纹识别demo_科学网—声纹识别、说话人识别软件,SPEAKER v0.1 - 石自强的博文...
  10. 三维建模软件有哪些?超详细三维建模软件介绍
  11. 压缩文件的格式zip和rar有什么区别?
  12. 中企海外周报 | 华为在德国发布mate30系列手机;一汽新车亮相法兰克福车展
  13. 计算机无法访问,您可能没有权限使用网络资源.请与这台服务器的管理员联系
  14. 描述十二个异性追求者的拓展
  15. 由frankmocap得到的.pkl文件转为.bvh或者.fbx
  16. 【5年Android从零复盘系列之十七】Android自定义View(12):手势绘制及GestureOverlayView事件详解(图文)
  17. Linux——操作系统安装
  18. Gateway+Nacos+Sleuth+Zipkin网关链路追踪(测试及源码),Gateway+FeignClient+Nacos通过网关远程调用微服务(一)
  19. 公司开除并在离职证明上贬低被程序员怒怼,网友:总有耿直的员工
  20. 优雅的二维数组循环赋值

热门文章

  1. java super.参数,Java super和this的对比及使用
  2. php之使用curl对百度orc进行文字识别(二维码识别同理)--base64编码方式(解决image format error)
  3. Spring Boot @ServletComponentScan 扫描 @WebServlet、@WebFilter、@WebListener
  4. LayaAir 缓动动画
  5. 数据库索引介绍及使用
  6. python3 下载网络图片
  7. 阶段3 2.Spring_02.程序间耦合_2 编译期依赖
  8. oracle中使用java存贮过程
  9. ubuntu 16.04 + zabbix 3.4 + postgresql shell
  10. flask使用配置文件