Python multiprocessing 模块解析 (5) – managers proxy篇(2)(从BaseProxy说起)(草稿)

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

前一篇介绍了 proxy register,
本篇以 proxy模式里的 BaseProxy 开始说起.

Continue reading

Python multiprocessing 模块解析 (4) – managers proxy篇(1)(从 register 开始)

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

前一篇介绍了 managers 模块的 Server 以及 CS的通信结构.
本篇介绍其通信方式: proxy

Continue reading

Python multiprocessing 模块解析 (3) – managers server(CS结构)

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

再回顾 [17.2.2.7. Managers – Python doc]关于 Manager 的定义:

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 提供了多进程环境下可以通过网络跨进程或者跨机器共享数据.
一个 manager object 控制一个 server 进程用于管理共享数据.
其他进程可以通过代理访问.

此篇探索 manager 模块 BaseManager 的 _Server类以及实例应用场景
Continue reading

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

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

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

Python multiprocessing 模块解析 (1) – context

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

本文就以 context 为起点开始模块探索.
Continue reading

Python globals() locals() vars() 三个内建函数的区别

在阅读模块源码里, 常常看到 globals() locals() 的使用, 这两个函数虽然可以从命名中
从外观上知道不同, 但仍然不明白具体使用方式和实际的意义. 带着好奇和疑问, 先看看
文档和搜索相关的博客, 额外还了解到vars() 函数的信息, 在此带着样例代码介绍.

Continue reading

应用于Restful接口的错误码设计 – ErrorCode Class(Python)

前言:
在前一家公司将工作方向切换为 Python Web 后, 基于现在流行的
Restful 接口开发方式开发, 在工作过程中, 也会遇到 http 状态码
不够表达具体 Web 业务服务层的某些错误状态, 参考新浪微博错误码的设计,
项目初期也定义了大量的常量类. 笔者在实践中, 使用 Python 实现的
常量类的方式也是随着对语言本身特性的理解而演化.

Continue reading

Python 新式类介绍 (包含 new-style-and-classic-classes 文档翻译)

我们使用 Python 开发时, 会遇到 class A 和 class A(object) 的写法,
这在 Python2 里是有概念上和功能上的区别, 即经典类(旧式类)与新式类的区别,
英文上分别描述为 old-style(classic-style) 与 new-style.

通过搜索, 先查阅了三个资料链接:
官方文档
stackoverflow 解答
Python Types and Objects

根据 stackoverflow 答案引出的语言发明者 Guido 写的一篇文章:
The Inside Story on New-Style Classes
其总结可以作为官方解释:


  • low-level constructors named __new__() – 低级别的构造函数.
    Note: Python 的 class __init__ 并不是其他语言意义上的构造函数,
    在 new 创建实例后对实例属性初始化的函数.

  • descriptors, a generalized way to customize attribute access – 描述符.
    或者说描述符协议支持.descriptor protocol __get__, __set__ ,__delete__ 等,
    可以阅读 descriptor 文档

  • static methods and class methods - 静态方法和类方法

  • properties (computed attributes) – 属性访问 setter getter.

  • decorators (introduced in Python 2.4) – 装饰器.
    现在装饰器语法糖遍布各Python框架.

  • slots – 用户设置后可以限定实例的属性.
    在 Python2 中替代 __dict__, 可以节省近 2/3 内存, Python3 中可以
    不因为优化内存使用率而使用 slots, 因为 __dict__ 结构内存做了优化,
    Note: __dict__ 并不是 Python 意义上的内置的 dict, 其实是一个 proxy 类.

  • a new Method Resolution Order (MRO) – MRO 方法解析次序改变
    (由左递归改为C3算法)

另一个答案增加了一点:

  • super added – super 方法支持

关于C3MRO介绍, 可以点击链接

以下是翻译官方文档的资料 (Python2的内容)


Classes and instances come in two flavors: old-style (or classic) and new-style.
类和实例有两种方式: 旧式(或者经典) 和 新式类.

Up to Python 2.1 the concept of class was unrelated to the concept of type,
and old-style classes were the only flavor available. For an old-style class,
the statement x.__class__ provides the class of x, but type(x) is always
<type ‘instance’>. This reflects the fact that all old-style instances, independent
of their class, are implemented with a single built-in type, called instance.

一直到 Python 2.1 class 的概念不与 type 不一样, 旧式类是唯一的风格. 对于一个
旧式类里, 陈述句 x.__class__ 提供 x 的 class, 但是 type(x) 一直是 <type ‘instance’>.
它反应了所有旧式类实例, 独立于它们的 class, 它们通过一个简单的内建 type 实现,
被称作 实例 instance.

New-style classes were introduced in Python 2.2 to unify the concepts of class
and type. A new-style class is simply a user-defined type, no more, no less.
If x is an instance of a new-style class, then type(x) is typically the same as
x.__class__ (although this is not guaranteed – a new-style class instance is
permitted to override the value returned for x.__class__).

新式类在Python 2.2 引入, 用于统一 class 和 type 的概念. 一个新式类简化了用户
自定义的 type, 不多不少. 如果 x 是一个新式类的实例 instance , type(x) 典型地
与 x.__class__ (尽管这并不能保证 – 一个新式类被允许重写 x.__class__ 的值)一致.

Continue reading