Python协程

协程简介

协程,即协作式程序,又称微线程、纤程,英文名Coroutine。

其思想是,一系列互相依赖的协程间依次使用CPU,每次只有一个协程工作,而其他协程处于休眠状态。协程可以在运行期间的某个点上暂停执行,并在恢复运行时从暂停的点上继续执行。
协程已经被证明是一种非常有用的程序组件,不仅被python、lua、ruby等脚本语言广泛采用,而且被新一代面向多核的编程语言如golang rust-lang等采用作为并发的基本单位。
协程可以被认为是一种用户空间线程,与传统的线程相比,有2个主要的优点:

  • 与线程不同,协程是自己主动让出CPU,并交付他期望的下一个协程运行,而不是在任何时候都有可能被系统调度打断。因此协程的使用更加清晰易懂,并且多数情况下不需要锁机制。
  • 与线程相比,协程的切换由程序控制,发生在用户空间而非内核空间,因此切换的代价非常小。

总结起来是一句话:协程可以认为是一种用户态线程,与系统提供的线程不同点是,它需要主动让出CPU时间,而不是由系统进行调度,即控制权在程序员手上。

Python协程史

  • Python 2.2 中的生成器让代码执行过程可以暂停 (yield)
  • Python 2.5 中可以将值返回给暂停的生成器,这使得 Python 中协程的概念成为可能 (send)
  • Python 3.3 中的 yield from,使得重构生成器与将它们串联起来都很简单 (yield from)
  • Python 3.4 以后通过标准库 asyncio 获得了事件循环的特性 (asyncio)
  • Python 3.5 使用async/await语法引入对协程的显式支持 (async/await)
  • Python 3.6 增强asyncio,支持异步生成器、异步解析式

浅析Python元类及应用

写这篇文章的缘由

前几天去一家公司面试,面试的岗位是Python后台开发,面试中被问到了一道题,考虑很久想不到答案,顾回来查阅资料在此总结一下。
题目的描述是这样的:

1
2
SQLAlchemy中Model中定义类成员时,如何做到声明顺序与数据库表的列顺序一致
提示:普通类成员是存储在__dict__,而dict本身是无序的

通过阅读SQLAlchemy源码得知,其内部实现是使用元类编程来完成的,元类编程是Python的一种高级黑暗魔法,经常听其大名,并没有进入深入了解,借此机会稍微总结一下。

元编程

元编程我个人理解是:用代码生成(操纵)代码的编程手法。
Python中元编程的几种手段:

  • 预定义方法
  • 函数赋值
  • descriptor
  • eval
  • 元类

上面的几种方式相对于元类来说简单一些,这里暂时先不讲了,以后有时间再去补充

My blog

关于博客

此blog是基于hexo-theme-even修改而来,目前已经托管到我个人的github仓库中,后面会持续更新。

博客内容

以技术学习与分享为主,主要关注:

  1. Web全栈
  2. JavaScript
  3. Node.js
  4. Python3
  5. Swift