Python程序中的进程操作-进程同步(multiprocess.Lock)
目录
- 一、多进程抢占输出资源
- 二、使用锁维护执行顺序
- 三、多进程同时抢购余票
- 四、使用锁来保证数据安全
通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用IO资源,但是也给我们带来了新的问题:当多个进程使用同一份数据资源的时候,就会引发数据安全或顺序混乱问题。
一、多进程抢占输出资源
import os
import time
import random
from multiprocessing import Processdef work(n):print('%s: %s is running' %(n,os.getpid()))time.sleep(random.random())print('%s:%s is done' %(n,os.getpid()))if __name__ == '__main__':for i in range(3):p=Process(target=work,args=(i,))p.start()
二、使用锁维护执行顺序
# 由并发变成了串行,牺牲了运行效率,但避免了竞争
import os
import time
import random
from multiprocessing import Process,Lockdef work(lock,n):lock.acquire()print('%s: %s is running' % (n, os.getpid()))time.sleep(random.random())print('%s: %s is done' % (n, os.getpid()))lock.release()
if __name__ == '__main__':lock=Lock()for i in range(3):p=Process(target=work,args=(lock,i))p.start()
上面这种情况虽然使用加锁的形式实现了顺序的执行,但是程序又重新变成串行了,这样确实会浪费了时间,却保证了数据的安全。
接下来,我们以模拟抢票为例,来看看数据安全的重要性。
三、多进程同时抢购余票
# 文件db的内容为:{"count":1}
# 注意一定要用双引号,不然json无法识别
# 并发运行,效率高,但竞争写同一文件,数据写入错乱
from multiprocessing import Process,Lock
import time,json,random
def search():dic=json.load(open('db'))print('剩余票数%s' %dic['count'])def get():dic=json.load(open('db'))time.sleep(0.1) # 模拟读数据的网络延迟if dic['count'] >0:dic['count']-=1time.sleep(0.2) # 模拟写数据的网络延迟json.dump(dic,open('db','w'))print('购票成功')def task():search()get()if __name__ == '__main__':for i in range(100): # 模拟并发100个客户端抢票p=Process(target=task)p.start()
四、使用锁来保证数据安全
# 文件db的内容为:{"count":5}
# 注意一定要用双引号,不然json无法识别
# 并发运行,效率高,但竞争写同一文件,数据写入错乱
from multiprocessing import Process,Lock
import time,json,random
def search():dic=json.load(open('db'))print('剩余票数%s' %dic['count'])def get():dic=json.load(open('db'))time.sleep(random.random()) # 模拟读数据的网络延迟if dic['count'] >0:dic['count']-=1time.sleep(random.random()) # 模拟写数据的网络延迟json.dump(dic,open('db','w'))print('购票成功')else:print('购票失败')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()
加锁可以保证多个进程修改同一块数据时,同一时间只能有一个任务可以进行修改,即串行的修改,没错,速度是慢了,但牺牲了速度却保证了数据安全。
虽然可以用文件共享数据实现进程间通信,但问题是:
- 效率低(共享数据基于文件,而文件是硬盘上的数据)
- 需要自己加锁处理
因此我们最好找寻一种解决方案能够兼顾:
- 效率高(多个进程共享一块内存的数据)
- 帮我们处理好锁问题。这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。
队列和管道都是将数据存放于内存中,队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。
转载于:https://www.cnblogs.com/nickchen121/p/11130253.html
Python程序中的进程操作-进程同步(multiprocess.Lock)相关推荐
- 在python程序中的进程操作
********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...
- python在中小学教学中的应用-在python程序中的进程操作
********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...
- python启动多个进程_Python程序中的进程操作--—--开启多进程
Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...
- python打开一个软件并进行操作_python程序中的进程操作
之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程 ...
- python进程数据共享_python程序中的进程操作-进程间的数据共享
展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中 ...
- Python程序中的线程操作-锁
目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...
- python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程
在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...
- 微课系列(7):Python程序中sys.argv的用法
技术要点: 1)Python程序中如果使用到了sys.argv,这样的程序一般需要在命令提示符环境中运行,而不是在Python开发环境直接中运行. 2)sys.argv是个包含若干字符串的列表,其中s ...
- 如何在Python程序中运行Unix命令
Unix是由Ken Thompson和Dennis Ritchie在1969年左右在AT&T贝尔实验室开发的操作系统. 我们可以使用许多有趣的Unix命令来执行不同的任务. 问题是,我们可以直 ...
- 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...
关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...
最新文章
- asp.net MVC 路由
- android自动化测试--appium运行的坑问题及解决方法
- Alluxio2.X简要介绍
- 利用Kinect实现用指尖隔空控制鼠标(源码放出)
- 力扣题目系列:1313. 解压缩编码列表
- 软考真题答案-2021年11月系统集成项目管理工程师上午题(一)
- 阿里云服务器和腾讯云服务器优缺点分析
- 【全网独家,收藏吧】10年全部《信息资源管理》真题整理,第2章 信息化规划与组织
- React中实现类似v-click-outside效果
- 【微信小程序】uniapp开发小程序如何使用微信云托管或云函数进行云开发
- MTU问题,为何抓包到1514
- Andorid屏幕唤醒异常,Power按键无法点亮屏幕的分析
- xgboost:防止过拟合的方法收缩和特征列、采样
- 数据库系统的内部体系(三级模式二级映像)
- 【Minio】实现视频断点续传功能
- Swapping Places题解
- MATLAB聚类分析--------2019/8/22
- Vue实现渐变色进度条
- 乔纳森·丹尼可编程经验20年总结的经验
- 10年java 工作难找吗_对比3-5年和10年的Java程序员,差距在哪里?