进程间数据共享 (multiprocess.Manager)

一、进程之间的数据共享

展望未来,基于消息传递的并发编程是大势所趋

即便是使用线程,推荐做法也是将程序设计为大量独立的线程集合,通过消息队列交换数据。

这样极大地减少了对使用锁定和其他同步手段的需求,还可以扩展到分布式系统中。

但进程间应该尽量避免通信,即便需要通信,也应该选择进程安全的工具来避免加锁带来的问题。

以后我们会尝试使用数据库来解决现在进程之间的数据共享问题。

1.1 Manager模块介绍

进程间数据是独立的,可以借助于队列或管道实现通信,二者都是基于消息传递的。

虽然进程间数据独立,但可以通过Manager实现数据共享,事实上Manager的功能远不止于此。

A manager object returned by Manager() controls a server process which holds Python objects and allows other processes to manipulate them using proxies.

A manager returned by Manager() will support types list, dict, Namespace, Lock, RLock, Semaphore, BoundedSemaphore, Condition, Event, Barrier, Queue, Value and Array.

1.2 Manager例子

from multiprocessing import Manager,Process,Lock
def work(d,lock):
with lock: # 不加锁而操作共享的数据,肯定会出现数据错乱
d['count']-=1 if __name__ == '__main__':
lock=Lock()
with Manager() as m:
dic=m.dict({'count':100})
p_l=[]
for i in range(100):
p=Process(target=work,args=(dic,lock))
p_l.append(p)
p.start()
for p in p_l:
p.join()
print(dic)

{'count': 0}

最新文章

  1. 【ubuntu 】常见错误--Could not get lock /var/lib/dpkg/lock
  2. MySQL数据库学习笔记(二)----MySQL数据类型
  3. MySQL 库大小、表大小、索引大小查询命令
  4. 获取View的高度宽度,屏幕参数,状态栏高度
  5. activemq重启
  6. YUI 之yui.js
  7. form 练习
  8. CSS+DIV标签命名规范 搜索引擎最喜欢
  9. 【Linux探索之旅】第一部分第六课:Linux如何安装在虚拟机中
  10. 安卓TV开发(五) 移动智能终端UI之实现主流TV焦点可控UI
  11. mysql 一张表的数据插入另一张表的sql语句
  12. AI deeplab
  13. Linux驱动
  14. 【python-dict】dict的使用及实现原理
  15. 分数拆分(Fractions Again?!, UVa 10976)
  16. oracleXE数据库没有公开wm_concat函数, 需要手动添加
  17. CF 463D Gargari and Permutations [dp]
  18. inline-block元素的空白间距解决方法<转>
  19. 借助CustomBehaviorsLibrary.dll写出水印效果(转)
  20. 钉钉 E应用 打开分享外链

热门文章

  1. CF1209B Koala and Lights
  2. axios实现类似form传值的格式,以及实现拦截器功能,response拦截实现权限判断
  3. chrome浏览器安装vue调试器vue-devtools
  4. windows driver 获取本地时间
  5. Tomcat9卸载与安装
  6. iOS如何禁用长按页面弹出菜单
  7. Integer和int的区别
  8. POJ 3970:Party
  9. 将list等分成n份
  10. ES6 之 第七种数据类型Symbol