Python 3 并发编程多进程之进程同步(锁)
Python 3 并发编程多进程之进程同步(锁)
进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,竞争带来的结果就是错乱,如何控制,就是加锁处理。
1、多个进程共享同一打印终端
from multiprocessing import Process import os,time def work():print('%s is running' %os.getpid())time.sleep(2)print('%s is done' %os.getpid())if __name__ == '__main__':for i in range(3):p=Process(target=work)p.start()
并发运行,效率高,但竞争同一打印终端,带来了打印错乱
from multiprocessing import Process,Lock import os,time def work(lock):lock.acquire()print('%s is running' %os.getpid())time.sleep(2)print('%s is done' %os.getpid())lock.release() if __name__ == '__main__':lock=Lock()for i in range(3):p=Process(target=work,args=(lock,))p.start()
由并发变成了串行,牺牲了运行效率,但避免了竞争
2、多个进程共享同一文件
文件当数据库,模拟抢票
#文件db的内容为:{"count":1} #注意一定要用双引号,不然json无法识别 from multiprocessing import Process,Lock import time,json,random def search():dic=json.load(open('db.txt'))print('\033[43m剩余票数%s\033[0m' %dic['count'])def get():dic=json.load(open('db.txt'))time.sleep(0.1) #模拟读数据的网络延迟if dic['count'] >0:dic['count']-=1time.sleep(0.2) #模拟写数据的网络延迟json.dump(dic,open('db.txt','w'))print('\033[43m购票成功\033[0m')def task(lock):search()get() if __name__ == '__main__':lock=Lock()for i in range(100): #模拟并发100个客户端抢票p=Process(target=task,args=(lock,))p.start()
并发运行,效率高,但竞争写同一文件,数据写入错乱
#文件db的内容为:{"count":1} #注意一定要用双引号,不然json无法识别 from multiprocessing import Process,Lock import time,json,random def search():dic=json.load(open('db.txt'))print('\033[43m剩余票数%s\033[0m' %dic['count'])def get():dic=json.load(open('db.txt'))time.sleep(0.1) #模拟读数据的网络延迟if dic['count'] >0:dic['count']-=1time.sleep(0.2) #模拟写数据的网络延迟json.dump(dic,open('db.txt','w'))print('\033[43m购票成功\033[0m')def task(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()
加锁:购票行为由并发变成了串行,牺牲了运行效率,但保证了数据安全
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。
虽然可以用文件共享数据实现进程间通信,但问题是:
1.效率低
2.需要自己加锁处理
为此mutiprocessing模块为我们提供了基于消息的IPC通信机制:队列和管道。
1 队列和管道都是将数据存放于内存中
2 队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,
我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。
转载于:https://www.cnblogs.com/qiangyuge/p/7460916.html
Python 3 并发编程多进程之进程同步(锁)相关推荐
- python 并发编程 多进程 目录
python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...
- python模拟app抢票_python并发编程多进程 模拟抢票实现过程
抢票是并发执行 多个进程可以访问同一个文件 多个进程共享同一文件,我们可以把文件当数据库,用多个进程模拟多个人执行抢票任务 db.txt {"count": 1} 并发运行,效率高 ...
- 学习笔记(28):Python网络编程并发编程-死锁与递归锁
立即学习:https://edu.csdn.net/course/play/24458/296445?utm_source=blogtoedu 1.死锁(Lock()的局限性) 知识点:Lock()只 ...
- 『Python学习笔记』Python实现并发编程(补充joblibpymysql)
Python实现并发编程(补充joblib&pymysql) 文章目录 一. 并发编程知识点 1.1. 为什么引入并发编程 1.2. 如何选择多线程多进程多协程 1.2.1. 什么是CPU密集 ...
- 第五十一篇 并发编程——多进程
目录 第五十一篇 并发编程--多进程 一.什么是进程 经典举例说明进程,以及切换 二.进程与程序 三.线程 进程和线程的关系 四.进程PID与PPID 1.PID 2.PPID 五.并发与并行,阻塞与 ...
- java的尝试性问题_Java并发编程实战 03互斥锁 解决原子性问题
文章系列 摘要 在上一篇文章02Java如何解决可见性和有序性问题当中,我们解决了可见性和有序性的问题,那么还有一个原子性问题咱们还没解决.在第一篇文章01并发编程的Bug源头当中,讲到了把一个或者多 ...
- JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)
JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer
- 徐无忌并发编程笔记:无锁机制CAS及其底层实现原理?
徐无忌并发编程笔记:无锁机制CAS及其底层实现原理? 完成:第一遍 1.什么是CAS算法? compare and swap:比较与交换,是一种有名的无锁算法 CAS带来了一种无锁解决线程同步,冲突问 ...
- Java并发编程实战之互斥锁
文章目录 Java并发编程实战之互斥锁 如何解决原子性问题? 锁模型 Java synchronized 关键字 Java synchronized 关键字 只能解决原子性问题? 如何正确使用Java ...
最新文章
- 网络编程学习笔记(gethostname函数)
- 三言两语说说进程调度
- 七、Excel中图表制作和展示
- python substr函数_Sql SUBSTR函数
- c#统计字符串中数字字符的个数【C#】
- George Moody 对OSEA 软件的修改
- 干货 | 万字长文带你复习线性代数!
- 武汉市15区科技企业孵化器及众创空间补贴附武汉市科技企业孵化器和众创空间管理办法
- 计量经济学计算机答案第一章,计量经济学计算机作业
- 最新Flutter 微信分享功能实现
- 超简单的Spring入门案例制作,快来看看吧!
- 数据库查询——选课系统
- 多层陶瓷电容器用处_陶瓷电容器作用详解
- 新手必看!纯干货!模具设计ug开启刀具半径补偿2种方法
- 微信、Uber、阴谋论和口袋罪
- seo和sem是什么意思
- Linux进程管理四大工具ps \dstat\ top\ htop
- 音量计算机的网红音乐,网红音乐10首抖音网红歌,抖音网红歌曲100首BGM精选
- 欧姆龙PLC HostLink通讯 C-MODE格式
- xmap 配置php环境,xmap 的动态 - SegmentFault 思否