互斥锁

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

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

优点:增加了安全性

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> 购票失败
'''

并发编程---互斥锁---互斥锁与join的区别的更多相关文章

  1. Java并发编程实战 03互斥锁 解决原子性问题

    文章系列 Java并发编程实战 01并发编程的Bug源头 Java并发编程实战 02Java如何解决可见性和有序性问题 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和 ...

  2. Python并发编程-GIL全局解释器锁

    Python并发编程-GIL全局解释器锁 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.GIL全局解释器锁概述 CPython 在解释器进程级别有一把锁,叫做GIL,即全局解释 ...

  3. 并发编程 - 线程 - 1.互斥锁/2.GIL解释器锁/3.死锁与递归锁/4.信号量/5.Event事件/6.定时器

    1.互斥锁: 原理:将并行变成串行 精髓:局部串行,只针对共享数据修改 保护不同的数据就应该用不用的锁 from threading import Thread, Lock import time n ...

  4. 网络编程基础----并发编程 ---守护进程----同步锁 lock-----IPC机制----生产者消费者模型

    1  守护进程: 主进程 创建 守护进程   辅助主进程的运行 设置进程的 daemon属性 p1.daemon=True 1 守护进程会在主进程代码执行结束后就终止: 2 守护进程内无法再开启子进程 ...

  5. Java并发编程(05):悲观锁和乐观锁机制

    本文源码:GitHub·点这里 || GitEE·点这里 一.资源和加锁 1.场景描述 多线程并发访问同一个资源问题,假如线程A获取变量之后修改变量值,线程C在此时也获取变量值并且修改,两个线程同时并 ...

  6. Java并发编程:synchronized和锁优化

    1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...

  7. Python并发编程(守护进程,进程锁,进程队列)

    进程的其他方法 P = Process(target=f,) P.Pid 查看进程号  查看进程的名字p.name P.is_alive()  返回一个true或者False P.terminate( ...

  8. Java并发编程:线程和锁的使用与解析

    线程的使用  新建线程 新建一个线程有两种方法:继承Thread类,然后重写run方法:实现Runnable接口,然后实现run方法.实际上Thread类也是实现的Runnable接口,再加上类只能单 ...

  9. Java并发编程(五)锁的使用(下)

    显式锁 上篇讲了使用synchronized关键字来定义锁,其实Java除了使用这个关键字外还可以使用Lock接口及其实现的子类来定义锁,ReentrantLock类是Lock接口的一个实现,Reen ...

  10. Java并发编程(四)锁的使用(上)

    锁的作用 锁是一种线程同步机制,用于实现互斥,当线程占用一个对象锁的时候,其它线程如果也想使用这个对象锁就需要排队.如果不使用对象锁,不同的线程同时操作一个变量的时候,有可能导致错误.让我们做一个测试 ...

随机推荐

  1. 5、二、App Components(应用程序组件):0、概述

    二.App Components(应用程序组件) 0.概述   App Components Android's application framework lets you create rich ...

  2. centos7设置时间和时区

    1.安装ntp服务软件包:yum install ntp 2.将ntp设置为缺省启动:systemctl enable ntpd 3.修改启动参数,增加-g -x参数,允许ntp服务在系统时间误差较大 ...

  3. 使用Python管理压缩包

    一. 使用tarfile库读取与创建tar包 1. 创建tar包 In [1]: import tarfile In [2]: with tarfile.open('demo.tar',mode='w ...

  4. 前端和后端的数据交互(jquery ajax+python flask+mysql)

    上web课的时候老师布置的一个实验,要求省市连动,基本要求如下: 1.用select选中一个省份. 2.省份数据传送到服务器,服务器从数据库中搜索对应城市信息. 3.将城市信息返回客户,客户用sele ...

  5. 百度网盘上下载文件,调用api接口的请求方式和参数

    REST api 功能:下载单个文件. Download接口支持HTTP协议标准range定义,通过指定range的取值可以实现断点下载功能. 例如: 如果在request消息中指定“Range: b ...

  6. LostRoutes项目日志——敌人精灵Enemy解析

    Enemy类在Enemy.js中,类Enemy类继承自PhysicsSprite,以便于可以使用物理引擎中的一些特性. 原版的Enemy.js: var Enemy = cc.PhysicsSprit ...

  7. Android打印当前所有线程及对应栈信息

    Map<Thread, StackTraceElement[]> threadMap = Thread.getAllStackTraces(); Log.e("albertThr ...

  8. redis-sentinel的理解实践

    一.前言 组内现在用的是redis 的sentinel. 本着实践的原则,对sentinel的几台服务器进行了网络或者抓包方面的实践. 一共三台redis服务器, 10.10.20.6, 10.10. ...

  9. 23种设计模式之原型模式(Prototype)

    在系统开发过程中,有时候有些对象需要被频繁创建,原型模式通过给出一个原型对象来指明所要创建的对象的类型,然后通过复制这个原型对象的办法,创建出更多同类型的对象.原型模式是一种对象创建型模式,用原型实例 ...

  10. python中的一个现象,db.commit和db.commit()

    假设有一个表,有自增字段,在开发环境中(sublime/Liclipse等)执行insert语句时,如果调用db.commit,那么数据库中不会有这条记录,但也不报错,再次插入成功时,自增自段加1. ...