目录

  • 一、多进程抢占输出资源
  • 二、使用锁维护执行顺序
  • 三、多进程同时抢购余票
  • 四、使用锁来保证数据安全

通过刚刚的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制。尽管并发编程让我们能更加充分的利用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()

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

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

  1. 效率低(共享数据基于文件,而文件是硬盘上的数据)
  2. 需要自己加锁处理

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

  1. 效率高(多个进程共享一块内存的数据)
  2. 帮我们处理好锁问题。这就是mutiprocessing模块为我们提供的基于消息的IPC通信机制:队列和管道。

队列和管道都是将数据存放于内存中,队列又是基于(管道+锁)实现的,可以让我们从复杂的锁问题中解脱出来,我们应该尽量避免使用共享数据,尽可能使用消息传递和队列,避免处理复杂的同步和锁问题,而且在进程数目增多时,往往可以获得更好的可获展性。

转载于:https://www.cnblogs.com/nickchen121/p/11130253.html

Python程序中的进程操作-进程同步(multiprocess.Lock)相关推荐

  1. 在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  2. python在中小学教学中的应用-在python程序中的进程操作

    ********在python程序中的进程操作********之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了, 运行中的程序就是一个进程.所有的进程都是通过 ...

  3. python启动多个进程_Python程序中的进程操作--—--开启多进程

    Python程序中的进程操作-----开启多进程 之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创 ...

  4. python打开一个软件并进行操作_python程序中的进程操作

    之前我们已经了解了很多进程相关的理论知识,了解进程是什么应该不再困难了,刚刚我们已经了解了,运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起来的python程序也是一个进程 ...

  5. python进程数据共享_python程序中的进程操作-进程间的数据共享

    展望未来,基于消息传递的并发编程是大势所趋 即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据. 这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中 ...

  6. Python程序中的线程操作-锁

    目录 一.同步锁 1.1 多个线程抢占资源的情况 1.1.1 对公共数据的操作 1.2 同步锁的引用 1.3 互斥锁与join的区别 二.死锁与递归锁 2.1 死锁 2.2 递归锁RLock 三.典型 ...

  7. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  8. 微课系列(7):Python程序中sys.argv的用法

    技术要点: 1)Python程序中如果使用到了sys.argv,这样的程序一般需要在命令提示符环境中运行,而不是在Python开发环境直接中运行. 2)sys.argv是个包含若干字符串的列表,其中s ...

  9. 如何在Python程序中运行Unix命令

    Unix是由Ken Thompson和Dennis Ritchie在1969年左右在AT&T贝尔实验室开发的操作系统. 我们可以使用许多有趣的Unix命令来执行不同的任务. 问题是,我们可以直 ...

  10. 关于python缩进的描述中_关于Python程序中与“缩进”有关的说法中,以下选项中正确的是()...

    关于Python程序中与"缩进"有关的说法中,以下选项中正确的是() 答:缩进在程序中长度统一且强制使用 同文学或同音乐主题的民歌,<_______>是其中之一.此曲经 ...

最新文章

  1. asp.net MVC 路由
  2. android自动化测试--appium运行的坑问题及解决方法
  3. Alluxio2.X简要介绍
  4. 利用Kinect实现用指尖隔空控制鼠标(源码放出)
  5. 力扣题目系列:1313. 解压缩编码列表
  6. 软考真题答案-2021年11月系统集成项目管理工程师上午题(一)
  7. 阿里云服务器和腾讯云服务器优缺点分析
  8. 【全网独家,收藏吧】10年全部《信息资源管理》真题整理,第2章 信息化规划与组织
  9. React中实现类似v-click-outside效果
  10. 【微信小程序】uniapp开发小程序如何使用微信云托管或云函数进行云开发
  11. MTU问题,为何抓包到1514
  12. Andorid屏幕唤醒异常,Power按键无法点亮屏幕的分析
  13. xgboost:防止过拟合的方法收缩和特征列、采样
  14. 数据库系统的内部体系(三级模式二级映像)
  15. 【Minio】实现视频断点续传功能
  16. Swapping Places题解
  17. MATLAB聚类分析--------2019/8/22
  18. Vue实现渐变色进度条
  19. 乔纳森·丹尼可编程经验20年总结的经验
  20. 10年java 工作难找吗_对比3-5年和10年的Java程序员,差距在哪里?

热门文章

  1. flask-mail异步发送邮件_Spring Boot与异步任务、定时任务、邮件任务
  2. 【渝粤教育】国家开放大学2018年春季 0239-21T电子商务物流管理 参考试题
  3. 【渝粤教育】电大中专电商运营实操 (2)作业 题库
  4. 【渝粤教育】电大中专学前儿童科学教育 (2)作业 题库
  5. [渝粤教育] 西南科技大学 英语写作 在线考试复习资料
  6. 矩阵分析 (三) 矩阵的标准形
  7. JavaScript 语言精粹 高清PDF中文版
  8. 数组排序:冒泡法和选择法
  9. Emacs shutcuts
  10. 图像sift配准后融合