python入门教程12-07 (python语法入门之进程互斥锁)

本章节主要介绍了进程互斥锁如何控制,而互斥锁的意思就是互相排斥,若是把多个进程比喻为多我的, 互斥锁的工做原理就是多我的都要去争抢同一个资源,下面咱们一块儿来看看吧!json

进程同步(multiprocess.Lock)安全

锁 —— multiprocess.Lock网络

进程之间数据不共享,可是共享同一套文件系统,因此访问同一个文件,或同一个打印终端,是没有问题的,并发

而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理dom

多进程模拟抢票实例ide

#文件db的内容为:{"count":1}#注意必定要用双引号,否则json没法识别from multiprocessing import Process,Lockimport time,json,randomdefsearch(): dic=json.load(open('db'))ui

print('\033[43m剩余票数%s\033[0m' %dic['count'])defget():    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')deftask():    search()

get()if __name__ == '__main__':

for i in range(100): #模拟并发100个客户端抢票        p=Process(target=task)

    p.start()# 引起问题:数据写入错乱

互斥锁保证数据安全code

from multiprocessing import Process,Lockimport time,json,randomdefsearch(): dic=json.load(open('db'))队列

print('\033[43m剩余票数%s\033[0m' %dic['count'])defget():    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')deftask(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()

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

问题:虽然能够用文件共享数据显示进程间数据通讯但问题是

效率低(共享数据基于文件,而文件是硬盘上的数据)

须要本身加锁处理

针对上述问题,咱们须要找到一种更加合理快捷的方式,那就是队列和管道,下一小节介绍

相关文章
相关标签/搜索