Python: 多进程的分布式进程multiprocessing.managers
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对象(点击查看方法)对应一个已经启动的子进程,它拥有一系列方法,可以为大部分常用数据类型创建并返回 代理对象 代理,用于进程间同步。甚至包括共享列表和字典。(
最新文章
- 杂乱无章之Oracle(二)
- C#实现GDI+基本图的缩放、拖拽、移动
- 用ioctl获取无线网络信息 /usr//include/linux/wireless.h
- 【模拟】Codeforces 671A Recycling Bottles
- 企业架构研究总结(41)——企业架构与建模之ArchiMate的由来和详述(上)
- A * B Problem Plus
- 201521123098 《Java程序设计》第1周学习总结
- mySQL使用实践
- hicoder1142 三分求极值
- Video Target Tracking Based on Online Learning—深度学习在目标跟踪中的应用
- 关于IOS开发的基本书籍推荐
- redis启动出现错误creating server tcp listening socket 127.0.0.1:6379: bind No error
- 一个class标签里面有多个属性时的提取标签
- HDFS知识点总结
- JS性能优化 之 文档片段 createDocumentFragment
- 混合线路接入时,360、QQ管家等测速显示电信IP或任意线路的IP
- Java并发编程原理与实战二十八:信号量Semaphore
- 信号(Django信号、Flask信号、Scrapy信号)
- 探讨一个“无法创建JVM”的问题(已解决)
- 算法笔记_154:算法提高 日期计算(Java)