互斥锁与join

互斥锁和join都可以把并发变成串行

以下代码是用join实现串行

from multiprocessing import Process
import time
import json class Foo(object): def search(self, name): with open("db.txt", "r") as f_read:
dic = json.load(f_read) time.sleep(1) # 模拟读数据的网络延迟
print("<%s>用户 查看剩余票数为 [%s]" % (name, dic["count"])) def get(self, name): with open("db.txt", "r") as f_read:
dic = json.load(f_read) if dic["count"] > 0:
dic["count"] -= 1
time.sleep(1) # 模拟写数据的网络延迟 with open("db.txt", "w") as f_write:
json.dump(dic, f_write) print("<%s> 购票成功" % name)
print("剩余票数为 [%s]" % dic["count"]) else:
print("没票了,抢光了") def task(self, name):
self.search(name)
self.get(name) if __name__ == "__main__": obj = Foo()
for i in range(1,11): # 模拟并发10个客户端抢票
p = Process(target=obj.task, args=("路人%s" % i,))
p.start()
p.join()

执行结果

<路人1>用户 查看剩余票数为 [1]
<路人1> 购票成功
剩余票数为 [0]
<路人2>用户 查看剩余票数为 [0]
没票了,抢光了
<路人3>用户 查看剩余票数为 [0]
没票了,抢光了
<路人4>用户 查看剩余票数为 [0]
没票了,抢光了
<路人5>用户 查看剩余票数为 [0]
没票了,抢光了
<路人6>用户 查看剩余票数为 [0]
没票了,抢光了
<路人7>用户 查看剩余票数为 [0]
没票了,抢光了
<路人8>用户 查看剩余票数为 [0]
没票了,抢光了
<路人9>用户 查看剩余票数为 [0]
没票了,抢光了
<路人10>用户 查看剩余票数为 [0]
没票了,抢光了

发现使用join将并发改成串行,确实能保证数据安全,

但join会把 ,整个程序所有进程都变成串行, 连查看都变成串行了

但问题是连查票操作,也变成只能一个一个人去查了,很明显大家查票时应该是并发地去查询而无需考虑数据准确与否,此时join与互斥锁的区别就显而易见了,

join是将一个任务整体串行,而互斥锁的好处则是可以将一个任务中的某一段代码串行,比如只让task函数中的get任务串行

互斥锁只把要共享数据修改的那段代码变成串行

四 总结

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

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

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

2、需要自己加锁处理

因此我们最好找寻一种解决方案能够兼顾:

1、效率高(多个进程共享一块内存的数据)

2、帮我们处理好锁问题。

这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。

队列和管道都是将数据存放于内存中,而队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,因而队列才是进程间通信的最佳选择。

我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。

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

  1. python 并发编程 多进程 互斥锁 目录

    python 并发编程 多进程 互斥锁 模拟抢票 互斥锁与join区别

  2. python 并发编程 多进程 互斥锁

    运行多进程  每个子进程的内存空间是互相隔离的 进程之间数据不能共享的 一 互斥锁 但是进程之间都是运行在一个操作系统上,进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终 ...

  3. python 并发编程 多线程 互斥锁

    互斥锁 并行变成串行,牺牲效率 保证数据安全,实现局部串行 保护不同的数据,应该加不同的锁 现在一个进程 可以有多个线程 所有线程都共享进程的地址空间 实现数据共享 共享带来问题就会出现竞争 竞争就会 ...

  4. Python并发编程-多进程进程锁

    from multiprocessing import Process import json import time from multiprocessing import Lock def sho ...

  5. python 并发编程 多进程 目录

    python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...

  6. 并发编程 - 进程 - 1.互斥锁/2.模拟抢票/3.互斥锁与join区别

    1.互斥锁: 互斥锁:Lock 原理就是把并发变成串行,一个一个运行,不错乱,但效率低 保证多个进程修改一块数据时,大家是一个一个修改,不错乱 mutex.acquire() mutex.releas ...

  7. python并发编程&多进程(二)

    前导理论知识见:python并发编程&多进程(一) 一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_cou ...

  8. Python并发编程-多进程

    Python并发编程-多进程 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.多进程相关概念 由于Python的GIL全局解释器锁存在,多线程未必是CPU密集型程序的好的选择. ...

  9. python并发编程&多进程(一)

    本篇理论居多,实际操作见:  python并发编程&多进程(二) 一 什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 举例(单核+多道,实现多个进程的并发执行) ...

随机推荐

  1. Jmeter插件介绍

    JMeterPlugin可以把JMeter生成的jtl文件做出很好的统计图,同时还支持机器的cpu.memory.swap.disk io和network的监控. 插件可分四类: 用于服务器性能监视的 ...

  2. 小猴打架:prufer

    我们概括题意,即将n个点组成一棵树的方案数. 所以是prufer. 又因为要考虑连边顺序,因此再乘上(n-1)!. 唔...难道你们都知道为什么是(n-1)!而不是n!吗... 反正我被这个地方卡了. ...

  3. Quartz(一)

    1 Quartz介绍 定时任务,无论是互联网公司还是传统的软件行业都是必不可少的,Quartz是好多优秀的定时任务开源框架的基础的. 我们应用最简单和最基础的配置,不需要太多参数,就可以轻松掌握企业中 ...

  4. git学习补充

    关系图 git checkout -- target 放弃 cached 中 对 target 文件内容已作的修改 git checkout . 放弃当前目录下对于 cached 的所有修改. 对比: ...

  5. HDU-2389-Rain on your Parade (最大匹配,kopcroft-karp)

    链接: https://vjudge.net/problem/HDU-2389 题意: You're giving a party in the garden of your villa by the ...

  6. SpringBoot框架(5)-- @EableAutoConfiguration项目应用

    场景:在项目中想在当前maven项目中自动装配其他自定义的Maven项目,例如,创建数据库配置中心,被夺多个maven引用,希望简单配置,就实现springboot自动装配数据库配置类. 由此我们联想 ...

  7. 【NOIP2014模拟10.25A组】画矩形

    题目 分析 由于要求按时间顺序来操作,考虑整体二分: 对于一段二分出来的区间,将左区间的修改和右区间的查询取出来,每次更新每个查询的答案,正确性显然. 现在有一对修改和查询的操作(保证所有的查询都在修 ...

  8. Python如何快速初始化一个二维数组

    正确的方法 cols= 3 rows = 2 memo = [[1] * m for i in range(n) ] 下面这种做法是错误的 memo = [[1] * m ] * n 这会导致 mem ...

  9. Codeforces 988D Points and Powers of Two ( 思维 || 二的幂特点 )

    题目链接 题意 : 给出坐标轴上的 n 个点的横坐标,要你选出最多的点,使得这些点两两距离是二的幂 ( 特殊情况 : 选出的集合只有一个点也满足条件 ) 分析 : 官方题解已经说的很好了 最关键是是判 ...

  10. Mysql 获取成绩排序后的名次

    其实就是输出mysql的排序后的行号   RT:获取单个用户的成绩在所有用户成绩中的排名   可以分两步: 1.查出所有用户和他们的成绩排名 ) as rowNo from t_user, () ) ...