博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
锁机制,信号机制,事件机制
阅读量:5173 次
发布时间:2019-06-13

本文共 3949 字,大约阅读时间需要 13 分钟。

一.锁机制

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

multiprocessing模块提供基于消息的ipc通信机制:队列和管道

  l = Lock()

  l.acquire() 锁,别的程序无法操作

  l.release()开锁,允许别的进程操作

模拟抢票

#文件db的内容为:{"count":1}#注意一定要用双引号,不然json无法识别#并发运行,效率高,但竞争写同一文件,数据写入错乱from multiprocessing import Process,Lockimport time,json,randomdef 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']-=1        time.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,Lockimport time,json,randomdef 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']-=1        time.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,Semaphoreimport 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, Eventimport 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语句开始                continue            print('车开远了,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()的值设置为False        else:            e.set()    # ---->将is_set()的值设置为True            print('***********',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

你可能感兴趣的文章
常用Dockerfile举例
查看>>
jquery的ajax用法
查看>>
设计模式-策略模式(Strategy)
查看>>
django orm 数据查询详解
查看>>
JarvisOJ Basic 熟悉的声音
查看>>
C# list导出Excel(二)
查看>>
CAS 单点登录模块学习
查看>>
Android应用开发-网络编程①
查看>>
input中的name,value以及label中的for
查看>>
静态库制作-混编(工程是oc为基础)
查看>>
jQuery 显示加载更多
查看>>
Confluence 6 系统运行信息中的 JVM 内存使用情况
查看>>
Confluence 6 升级以后
查看>>
用JS实现版面拖拽效果
查看>>
二丶CSS
查看>>
《avascript 高级程序设计(第三版)》 ---第二章 在HTML中使用Javascript
查看>>
JS一些概念知识及参考链接
查看>>
TCP/IP协议原理与应用笔记24:网际协议(IP)之 IP协议的简介
查看>>
SAP HANA开发中常见问题- 基于SAP HANA平台的多团队产品研发
查看>>
游戏中的心理学(一):认知失调有前提条件
查看>>