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

进程同步(multiprocess.Lock)

锁 —— multiprocess.Lock

进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,

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

多进程模拟抢票实例

#文件db的内容为:{"count":1}#注意一定要用双引号,不然json无法识别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(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()# 引发问题:数据写入错乱

互斥锁保证数据安全

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()

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

问题:虽然可以用文件共享数据显示进程间数据通信但问题是

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

需要自己加锁处理

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

©著作权归作者所有:来自51CTO博客作者上海老男孩教育的原创作品,如需转载,请注明出处,否则将追究法律责任

更多相关文章

  1. 预测优秀数据科学家的五个面试问题 | Python英语-Issue15
  2. Bokeh中独特的数据类型简介: ColumnDataSource | Bokeh 小册子
  3. Bokeh中数据的添加、修改和筛选 | Bokeh 小册子
  4. 毫秒时间戳标识消息导致数据丢失的问题排查
  5. Pandas小册子:日期数据处理 - 如何按日期筛选、显示及统计数据
  6. 2017年文章汇总 - Python数据之道
  7. Python数据类型-List介绍(下)-列表推导式
  8. Python数据类型-List介绍(上)
  9. 内卷?猝死?企业如何利用数据分析提升人效比,让员工远离“996”?

随机推荐

  1. jquery做的表格分页功能
  2. 笨鸟求问,下拉列表实现局部刷新的问题
  3. 在Wordpress中包含一个github jquery插件
  4. Jquery Validate 正则表达式实用验证代码
  5. 如何检索类以隐藏按钮?
  6. [置顶] JavaWeb JQuery实现记住我
  7. jQuery循环没有每个和回调函数
  8. jquery编写web页面头部分类的选中事件$.c
  9. 通过ajax POST提交nicEdit文本编辑器的值
  10. Google地图信息窗口左箭头,右箭头传递Type