互斥锁

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

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

优点:增加了安全性

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. [Model] GoogLeNet

    主要就是对Inception Module的理解 网络结构分析 没有densy layer竟然,这是给手机上运行做铺垫么. 一个新型的模块设计: [不同类型的layer并行放在了一起] 最初的设计: ...

  2. 一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数

    一个表中的id有多个记录,把所有这个id的记录查出来,并显示共有多少条记录数 select id ,Count(*) from table_name group by id having count( ...

  3. Unity3D UGUI Shader画一个圆环

    Shader "Unlit/NewUnlitShader" { Properties { _MainTex ("Texture", 2D) = "wh ...

  4. 宝塔使用FTP的问题

    我们在使用宝塔FTP面板的时候,会用到FTP工具,但是开的账号在使用 FTP或WinSCP的时候会出现问题,连接不上. 具体解决方式: 参考文档: https://blog.csdn.net/hc11 ...

  5. 数据结构与算法——基数排序简单Java实现

    基数排序(radix sort)又称“桶子法”,在对多个正整数进行排序时可以使用.它的灵感来自于队列(Queue),它最独特的地方在于利用了数字的有穷性(阿拉伯数字只有0到9的10个). 基数排序使用 ...

  6. ModelAttribue注解的使用

    Spring中有很多注解,如RequestParam,PathVarible,SesstionAttribute,这些在开发是多尝试一下,可能用得到,ModelAttribute用的还挺多,可以以此为 ...

  7. js函数 eql,equal,equalp

    function eql(obj, other) { if(stringp(obj) && stringp(other) && obj === other) retur ...

  8. 可访问性(Accessibility) => 无障碍功能

    了解无障碍功能及其范围和影响可令您成为更出色的网络开发者 复杂的一笔 https://developers.google.cn/web/fundamentals/accessibility/ ARIA ...

  9. css3---2D效果 ---3D效果

    CSS3边框: CSS3圆角:border-radius(**px 或 **%) 属性——创建边框线的圆角 CSS3盒子阴影:box-shadow属性——创建阴影 box-shadow:30px 0p ...

  10. logback logback.xml常用配置详解(一)<configuration> and <logger>

    logback logback.xml常用配置详解(一)<configuration> and <logger> 博客分类: Log java loglogback  原创文章 ...