multiprocessing.managers

在Thread和Process中,应当优选Process,因为Process更稳定,而且,Process可以分布到多台机器上,而Thread最多只能分布到同一台机器的多个CPU上。

Python的multiprocessing模块不但支持多进程,其中managers子模块还支持把多进程分布到多台机器上。一个服务进程可以作为调度者,将任务分布到其他多个进程中,依靠网络通信。由于managers模块封装很好,不必了解网络通信的细节,就可以很容易地编写分布式多进程程序。

Server process

Manager()返回一个manager对象。它控制一个服务器进程,这个进程会管理Python对象并允许其他进程通过代理的方式来操作这些对象。

manager对象支持多种类型。例子见下:

from multiprocessing import Process, Manager

def f(d, l):
d[1] = ""
d[""] = 2
d[0.25] = None
l.reverse() if __name__ == '__main__':
with Manager() as manager:
d = manager.dict()     #产生一个代理对象d
l = manager.list(range(10)) p = Process(target=f, args=(d,l))
p.start()
p.join() print(d)
print(l)

解释:

with语句:见这篇文章

with 语句是从 Python 2.5 开始引入的一种与异常处理相关的功能(2.5 版本中要通过 from __future__ import with_statement 导入后才可以使用),从 2.6 版本开始缺省可用(参考 What's new in Python 2.6? 中 with 语句相关部分介绍)。

with 语句适用于对资源进行访问的场合,确保不管使用过程中是否发生异常都会执行必要的“清理”操作,释放资源,比如文件使用后自动关闭、线程中锁的自动获取acquire和release等。

⚠️,with语句的实现类似try..finally。

代理对象:

  • 指向其他共享对象的对象。
  • 共享对象也可以说是代理 指涉 的对象。
  • 多个代理对象可能指向同一个指涉对象。

代理对象代理了指涉对象的一系列方法调用(虽然并不是指涉对象的每个方法都有必要被代理)。通过这种方式,代理的使用方法可以和它的指涉对象一样:

>>> from multiprocessing import Manager
>>> manager = Manager()
>>> l = manager.list([i*i for i in range(10)])
>>> print(l)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
>>> print(repr(l))
<ListProxy object, typeid 'list' at 0x...>
>>> l[4]
16
>>> l[2:5]
[4, 9, 16]

上面使用了list(), dict()方法

管理器的特点:

服务器进程管理器比使用共享内存对象更灵活,它们支持二进制对象类型。

同时,一个单独的manager可以被网络上的不同计算机的进程共享。

缺点是比使用shared memory慢。

使用manager对象可以创建一个共享queue。具体见下一章节:


Managers

Managers提供了创建一种数据的方法,这个数据可以被不同的进程共享。这种共享也包括通过网络在不同计算机的进程上共享。

multiprocessing.Manager()

返回一个已启动的SyncManager对象(BaseManager的子类的实例对象),用于在进程之间分享数据。

SyncManager对象(点击查看方法)对应一个已经启动的子进程,它拥有一系列方法,可以为大部分常用数据类型创建并返回 代理对象 代理,用于进程间同步。甚至包括共享列表和字典。(

最新文章

  1. 杂乱无章之Oracle(二)
  2. C#实现GDI+基本图的缩放、拖拽、移动
  3. 用ioctl获取无线网络信息 /usr//include/linux/wireless.h
  4. 【模拟】Codeforces 671A Recycling Bottles
  5. 企业架构研究总结(41)——企业架构与建模之ArchiMate的由来和详述(上)
  6. A * B Problem Plus
  7. 201521123098 《Java程序设计》第1周学习总结
  8. mySQL使用实践
  9. hicoder1142 三分求极值
  10. Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用
  11. 关于IOS开发的基本书籍推荐
  12. redis启动出现错误creating server tcp listening socket 127.0.0.1:6379: bind No error
  13. 一个class标签里面有多个属性时的提取标签
  14. HDFS知识点总结
  15. JS性能优化 之 文档片段 createDocumentFragment
  16. 混合线路接入时,360、QQ管家等测速显示电信IP或任意线路的IP
  17. Java并发编程原理与实战二十八:信号量Semaphore
  18. 信号(Django信号、Flask信号、Scrapy信号)
  19. 探讨一个“无法创建JVM”的问题(已解决)
  20. 算法笔记_154:算法提高 日期计算(Java)

热门文章

  1. 制作VB项目打包工具与安装程序
  2. prometheus 的promsql的经典例子 安装grafana
  3. Apache——开启个人用户主页功能
  4. *【Python】【demo实验27】【练习实例】【定义递归函数】
  5. python调用hanlp进行命名实体识别
  6. 解决连接HIS连接不上数据库的问题
  7. GoJS
  8. Linux(CentOS)下安装NVIDIA GPU驱动
  9. Feign的雪崩处理
  10. Adaboost推导