1.Manager
Manager()返回的manager对象控制了一个server进程,该进程包含的数据可以被别的进程通过proxies来访问,从而达到与多进程间数安全通信的目的。该模块常和Pool模块一起使用,用于进程之间的资源共享。
Manager对多种类型都有较好的支持,常见的类型有list,dict,Namespace,Lock,Lock,Semaphore,BoundedSemaphore,Condition,Event,Queue,Value和Array等。
管理器是独立运行的子进程,其中存在真实的对象,并以服务器的形式运行,其他进程通过使用代理访问共享对象,这些代理作为客户端运行。Manager()是BaseManager的子类,返回一个启动的SyncManage()实例,可用于创建共享对象并返回这些共享对象的代理。
2.BaseManager
2.1构造方法
BaseManager(address[, authkey])
address:(hostname, port),指定服务器的网址地址,默认为简单分配一个空闲的端口
authkey:连接到服务器的客户端的身份验证,默认为current_process().authkey的值
2.2 实例方法
start([initializer[, initargs]]):启动一个单独的子进程,并在子进程中启动管理器服务器。
get_server():获取服务器对象
connect():连接管理器对象
shutdown():关闭管理器对象,只能在调用start()方法之后调用。
2.3 实例属性
address:只读属性,管理服务器正在使用的地址
3.使用实例
from multiprocessing import Process, Manager
def f(x, array, list1, dict1, namespace):
x.value = 3.14
array[0] = 5
list1.append('hello')
dict1[1] = 2
namespace.a = 10
if __name__ == '__main__':
server = Manager()
x = server.Value('d', 0.0)
array = server.Array('i', range(10))
list1 = server.list()
dict1 = server.dict()
namespace = server.Namespace()
proc = Process(target=f, args=(x, array, list1, dict1, namespace))
proc.start()
proc.join()
print(x.value)
print(array)
print(list1)
print(dict1)
print(namespace)
result:
3.14
array('i', [5, 1, 2, 3, 4, 5, 6, 7, 8, 9])
['hello']
{1: 2}
Namespace(a=10)