原创博客地址:python进阶13并发之九多进程和数据共享

使用进程,大概率出现情况是,想当然以为共享了,实际没共享。所以最终程序大概率卡死(部分逻辑没有数据进来,导致的业务逻辑性卡住,并非程序死锁)

哪些共享,哪些不共享

默认进程是都不共享,包括全局变量
父子进程其实处于不同的资源空间(进程是系统分配资源的最小单位),所以2进程其实是完全独立的资源空间,数据自然无法直接交互。如果要交互,必须超越进程内部,进入到操作系统层面,比如文件方式,等进行交互。
其实父子进程是一种非常松散的关系,在一个app中启动另一个app的关系就可以看做父子进程。只是开发过程中,大多数父子进程都是强业务关联的,所以自然会有一种虚幻的“亲密关系”,实际上这只是想当然的,子进程一旦启动,基本就和父进程没什么关系了,虽然不是完全没有,比如守护进程需要在父进程退出时也退出,但这个是操作系统的权利,而非父进程的权利。
所以,可以认为进程内变量都不共享!

如何实现共享(参考博文:python进阶06并发之二技术点关键词)

共享数据的同步

这个问题其实线程也存在,所以解决方法其实和线程类似的。
优点是进程数据默认独立的,凡是共享数据,其实都是非常“突出”的,容易定位,找到多个进程的共享变量,相关临界区加上锁即可(视情况,未必一定是“加锁的方式”,或一定需要加锁,原子操作依然不需加锁)
另外需要留意以下几点:
01,虽然使用了manager()封装好的dict()或list()对象,这些对象只能保证数据的共享,不能保证数据的同步,也就是说也需要自己考虑加锁问题。
02,dict=manager().dict(),dict[‘abc’]=list(‘asdf’),这个赋值操作是进程安全的,而dict[‘abc’][2]=’f’,就未必了,应当避免使用后者的赋值方式。(不要尝试绕过manager()的操作,最好采用最为稳妥的赋值方式)
03,创建进程时,参数必须能够被pickle,所以有些自定义的类对象实例是不能被作为参数的。和threading不同,multiprocessing Process参数必须能够被pickle进行序列化

使用了multiprocessing.Value为何还需要加锁

本质上而言,共享和锁没有必然关系!,只是不共享不需加锁共享协程不加锁共享普通进程(线程)该加锁还是要加锁
在multiprocessing库中的Value是细粒度的,Value中有一个ctypes类型的对象,拥有一个value属性来表征内存中实际的对象。Value可以保证同时只有一个单独的线程或进程在读或者写value值。这么看起来没有什么问题。
然而在第一个进程加载value值的时候,程序却不能阻止第二个进程加载旧的值。两个进程都会把value拷贝到自己的私有内存然后进行处理,并写回到共享值里。
共享变量虽然做了一定锁封装,但是其锁粒度都是非常细的,而程序中涉及临界区可能比较大仅依靠共享变量自身锁是无法限制住的。

参考

Python多进程相关的坑
Python分布式进程中你会遇到的坑
Python多进程开发中使用Manager进行数据共享的陷阱
python多进程Pool使用遇到的坑
python multiprocessing多进程变量共享与加锁

python进阶13并发之九多进程和数据共享相关推荐

  1. python进阶06并发之二技术点关键词

    原创博客地址:python进阶06并发之二技术点关键词 GIL,线程锁 python中存在GIL这个"线程锁", 关键地方可以使用c语言解决 GIL问题 然后可以提高cpu占用效率 ...

  2. python进阶12并发之八多线程与数据同步

    原创博客地址:python进阶12并发之八多线程与数据同步 python并发首选进程,但偶尔有场景进程无法搞定,比如有些变量是无法序列化的,就无法使用工具包manager()的工具类进行共享.如果自己 ...

  3. Python 进阶之路 (十二) 尾声即是开始

    Python进阶之路总结 大家好,我的<< Python进阶之路>>到这一期就到此为止了,和 <<Python 基础起步>>不同,在掌握了一些基础知识后 ...

  4. python进阶之多进程

    python进阶之多进程 0.导语1.进程与线程初识1.1 导包1.2 定义被调函数1.3 创建线程和进程1.4 启动线程和进程2.输出结果存放至Queue2.1 导包2.2 定义被调函数2.3 启动 ...

  5. Python 进阶之路 (九) 再立Flag, 社区最全的itertools深度解析(上)

    前言 大家好,今天想和大家分享一下我的itertools学习体验及心得,itertools是一个Python的自带库,内含多种非常实用的方法,我简单学习了一下,发现可以大大提升工作效率,在sf社区内没 ...

  6. python进阶21之actor

    原创博客地址:python进阶21之actor actor模型.actor模式是一种最古老的也是最简单的并行和分布式计算解决方案. 优点:充分利用单线程+事件机制,达到了多线程效果. 缺点,对pyth ...

  7. python进阶11并发之七多种并发方式的效率测试

    原创博客地址:python进阶11并发之七多种并发方式的效率测试 测试map,apply_async,gevent协程爬虫 测试代码:网页爬虫 函数代码 1 2 3 4 5 6 7 8 9 10 11 ...

  8. Python进阶之递归函数的用法及其示例

    作者 | 程序员adny 责编 | 徐威龙 封图| CSDN│下载于视觉中国 出品 |  AI科技大本营(ID:rgznai100) 本篇文章主要介绍了Python进阶之递归函数的用法及其示例,现在分 ...

  9. Python进阶6——序列操作

    1.序列的拼接和复制 Python中使用+对序列进行拼接,使用*对序列进行复制 s=str(1234) l=list(range(2,13)) print(s,l) print('---------- ...

最新文章

  1. Linux BSP非标准HDMI分辨率
  2. 开源!mathAI手写拍照自动能解高数题,还不快试试?
  3. ACM: 畅通工程-并查集-解题报告
  4. html随页面移动固定,div设置了position: fixed属性后如何可以做到随浏览器左右移动?...
  5. 攻击 xxs_“吃鸡”又出现1招炸队友不受惩罚,xxs乐坏了,请别手误打载具
  6. Spark源码分析之Worker
  7. JS中怎样比较两个 时分秒 格式的时间大小
  8. python+PyQT+Eric安装配置
  9. 图像变换dpi(tif->jpg),直方图均衡化,腐蚀膨胀,分水岭,模板匹配,直线检测
  10. iphone储存空间系统怎么清理_教你快速清理 iPhone 系统缓存垃圾,拒绝卡顿!
  11. 致盲目标检测算法,阿里清华发起 “对抗攻击” 挑战赛!
  12. Block Formatting Contexts(块级格式化上下文)
  13. 使用Kotlin的Android ProgressBar
  14. Android Debug方法
  15. 【Cesium】Cesium三维模型调整
  16. CnPack常用的功能,太方便了!
  17. C++ 二叉树求叶子结点数及输出叶子结点的路径
  18. CSS盒子模型居中方法,高级面试题+解析
  19. 【备忘】总结一些Java学习者经常去的网站及论坛
  20. apache Fop 2.1 支持中文

热门文章

  1. 路由器太远手机接收不到信号怎么办?
  2. hbase记录日志wal_SQL Server事务日志–第1部分–日志结构和预写日志记录(WAL)算法
  3. sql 数据库维护索引_SQL索引维护
  4. Redis - 数据持久化
  5. Canvas--文字渲染
  6. SPSS统计基础-均值功能的使用
  7. 20155207 实验五 网络编程与安全
  8. 蓝桥杯---简单的计算器
  9. linux下实现web数据同步的四种方式(性能比较)
  10. [LinuxVim]基础01