互斥锁

互斥锁:就是把多个进程并发,修改成一块共享数据的操作变成串行,保证是一个一个来修改的。

缺点:效率低,加锁过程复杂

优点:增加了安全性

from multiprocessing import Process,Lock
import time def task(name, mutex):
mutex.acquire() # 加锁
print('%s 1' %name)
time.sleep(1)
print('%s 2' % name)
time.sleep(1)
print('%s 3' % name)
mutex.release() # 释放锁 if __name__ == '__main__':
mutex=Lock()
for i in range(3):
p = Process(target=task,args=('进程%s' %i,mutex))
p.start()
'''
打印结果:
进程0 1
进程0 2
进程0 3
进程1 1
进程1 2
进程1 3
进程2 1
进程2 2
进程2 3
'''

互斥锁

模拟抢票

from multiprocessing import Process,Lock
import json
import time def search(name):
time.sleep(1) # 模拟网络延迟
dic = json.load(open('db.txt','r',encoding='utf-8'))
print('<%s>查看剩余票数 [%s]' %(name, dic['count'])) def get(name):
time.sleep(1)
dic = json.load(open('db.txt','r',encoding='utf-8'))
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(3)
json.dump(dic,open('db.txt','w',encoding='utf-8'))
print('<%s> 购票成功' %name) def task(name,mutex):
search(name) # 并发的进行
mutex.acquire()
get(name)
mutex.release() if __name__ == '__main__':
mutex=Lock()
for i in range(10):
p=Process(target=task,args=('路人%s' %i,mutex))
p.start()
'''
打印结果:
<路人0>查看剩余票数 [1]
<路人4>查看剩余票数 [1]
<路人1>查看剩余票数 [1]
<路人2>查看剩余票数 [1]
<路人5>查看剩余票数 [1]
<路人3>查看剩余票数 [1]
<路人8>查看剩余票数 [1]
<路人6>查看剩余票数 [1]
<路人7>查看剩余票数 [1]
<路人9>查看剩余票数 [1]
<路人0> 购票成功
'''

模拟抢票

互斥锁和join的区别

from multiprocessing import Process,Lock
import json
import time
'''
互斥锁:可以让局部代码串行
join:只能让全部代码变成串行
'''
def search(name):
time.sleep(1) # 模拟网络延迟
dic = json.load(open('db.txt','r',encoding='utf-8'))
print('<%s>查看剩余票数 [%s]' %(name, dic['count'])) def get(name):
time.sleep(1)
dic = json.load(open('db.txt','r',encoding='utf-8'))
if dic['count'] > 0:
dic['count'] -= 1
time.sleep(3)
json.dump(dic,open('db.txt','w',encoding='utf-8'))
print('<%s> 购票成功' %name)
else:
print('<%s> 购票失败' %name) def task(name,mutex):
search(name) # 并发的进行
mutex.acquire()
get(name)
mutex.release() if __name__ == '__main__':
mutex=Lock()
for i in range(3):
p = Process(target=task,args=('路人%s' %i,mutex))
p.start()
p.join()
'''
join打印结果:
<路人0>查看剩余票数 [1]
<路人0> 购票成功
<路人1>查看剩余票数 [0]
<路人1> 购票失败
<路人2>查看剩余票数 [0]
<路人2> 购票失败 互斥锁的打印结果:
<路人1>查看剩余票数 [1]
<路人0>查看剩余票数 [1]
<路人2>查看剩余票数 [1]
<路人1> 购票成功
<路人0> 购票失败
<路人2> 购票失败
'''

最新文章

  1. MIP 官方发布 v1稳定版本
  2. C/C++ 静态链接库(.a) 与 动态链接库(.so)
  3. bootstrap——下拉菜单右对齐
  4. VS中基于对话框的MFC利用换肤改变边框颜色及格式
  5. 制作Java视频播放器
  6. 跟随标准与Webkit源码探究DOM -- 获取元素之getElementsByTagName
  7. wpa_cli调试工具的使用
  8. [Javascript,JSON] JQuery处理json与ajax返回JSON实例
  9. 时序列数据库武斗大会之什么是 TSDB ?
  10. xss(跨站脚本攻击),crsf(跨站请求伪造),xssf
  11. IOS 学习笔记 2015-04-08 OC-NSUserDefaults 持久化对象
  12. 使用zTree和json构建简单树节点
  13. 【LeetCode】462. Minimum Moves to Equal Array Elements II
  14. LVS+Keepalived实现DBProxy的高可用
  15. 关于C/S框架网单表绑定,查询
  16. Go 语言变量作用域
  17. vue的事件处理梳理
  18. Asp.Net WebApi核心对象解析(二)
  19. [转载]前端——实用UI组件库
  20. 使用Google-Colab训练PyTorch神经网络

热门文章

  1. 【转载】eclipse常用插件在线安装地址或下载地址
  2. 获取HttpServletRequest请求Body中的内容
  3. linux命令学习(4):cd命令
  4. nohup 同时实现记录日志和屏幕输出
  5. CodeForces - 754D
  6. linux下安装svn出现configure: error: We require OpenSSL; try --with-openssl
  7. css学习_css写的位置
  8. Ubuntu 16.04 编译OpenCV 问题解决stdlib.h: No such file or directory
  9. HDU 4699 - Editor - [对顶栈]
  10. [No0000120]Python教程3/9-第一个Python程序