Python multiprocessing 模块解析 (2) – managers 初探轮廓

前言:
工作中不少场景是开发后台脚本独, 比如定时job, 扫表, 事件消费等任务.
Python 是首选语言, 其次才是编译型的Golang(有性能要求的任务). 多数
时候单进程脚本足够执行任务, 少数如高频的UGC社区顶踩动作, api 层
将动作写入消息队列异步处理(mq-> job平台 or 自管理的消费脚本进程),
单进程脚本消费能力跟不上, 如果考虑坚持用 Python 情况下同时部署
多个脚本进程消费或者基于 multiprocessing 都是合适的解决方案. 这里
就引出了 multiprocessing 模块, 既然与该模块常打交道, 那么可以带着
好奇心去看看模块的实现 :) 本文以 Python3.5探索其机制

此篇探索 manager 模块的整个轮廓,
关于 server, shared object, shared data, Proxy 等概念将在后续篇章讲述.

1. 什么是 Manager

1.1. 对外暴露的 Manager 函数

由上一篇 [Python3 multiprocessing 模块解析 (1) – context]介绍context的实际意义,
multiprocessing 模块空间引出的函数和类成员实际是 context 提供(context结构梳理
可以看上篇文章附图).
context 暴露的其中一个类即 Manager:

Manger 函数定义:

实际上内部使用了 SyncManager, 类似 Manger 方法, 返回真正的实例前才使用相对引用,
而不是在 context 全局提前 import, 这样 lazy import 的好处是根据系统平台的
不同引出不同模块下同名的类, eg:

Linux:
ForkProcess::Popen -> from .popen_fork import Popen
Windows:
SpawnProcess::Popen -> from .popen_spawn_posix import Popen

我们通常会这么写:

这样引出了 SyncManager.

1.2. SyncManager类

那么这个 SyncManager 实例实际会做什么呢?
看看 multiprocessing::manager::SyncManager 的源码

SyncManager 如注释所说, 提供一系列的共享对象类型, 注册的数据类型用于多线程
(进程)环境的同步化. mp模块提供常用的 dict list 数据结构可以在多线程(进程)环境
中表现如单线程下的行为. 以 list 为例子, insert 和 pop 等操作, 如果直接使用原生的
list, 那么会产生数据访问的竞争关系, 导致不可预期的行为, 而 mp 模块通过 proxy
代理(list 对应 ListProxy)的方式使得数据竞争的问题解决.

关于 Manager 的描述, 参见 17.2.2.7. Managers

Managers provide a way to create data which can be shared between
different processes, including sharing over a network between
processes running on different machines. A manager object
controls a server process which manages shared objects.
Other processes can access the shared objects by using proxies.

Manager 提供了多进程环境中共享数据的使用的方案, 共享数据可以支持
跨进程, 甚至跨机器访问, 以网络通信的方式实现(eg: unix socket, tpc),
一个 manager 实例控制一个 server 进程(manager 自己创建的后台进程,
对用户透明), 该 server 负责管理共享数据. 其他进程则是用户业务创建的,
它们可以通过代理方式来访问 manager 自带 server 的共享数据. 代理可以
理解为一个网络通道, 业务进程 和 manager server 进程通信交互数据, 由于
server 单线程, 对业务进程通信请求FIFO的方式来处理数据, 因此保证了操作
行为的可预期性(当然如果业务进程希望锁定数据, 可以通过代理的 Lock 锁机制
来实现).

1.3. 简述

因此对 Manager 的简述: 提供共享数据服务的管理器, 就酱!
使用者安心用, 有Proxy在, 保证你的list,dict,Queue 还是原汁原味的那个!

2. multiprocessing.manager 整体轮廓

在后续文章详细讲解之前, “画”个草图描述 Manager类 :)
右键另打开链接地址看大图

原创文章,转载请注明: 转载自kaka_ace's blog

本文链接地址: Python multiprocessing 模块解析 (2) – managers 初探轮廓

One thought on “Python multiprocessing 模块解析 (2) – managers 初探轮廓

发表评论

电子邮件地址不会被公开。 必填项已用*标注