多进程系列之Manager类

281 阅读1分钟

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)