1.什么是coroutine

coroutine,最早我是在lua里面看到的,coroutine最大的好处是可以保存堆栈,让程序得以继续执行,在python里面,一般是利用yield来实现,具体可以看如下文章:

http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html

python中的yield以及yield from语法可以让程序支持coroutine

2.asyncio库

Python3中,提供了基于coroutine的异步IO库,就是asyncio

https://docs.python.org/3/library/asyncio.html

2.1 event loop

asyncio库一个重要的概念就是事件循环,只有启动事件循环以后,才可以让coroutine任务得以继续执行,如果event loop停止或者暂停,那么整个异步io也停止或者暂停,类似于操作系统的事件循环机制

asyncio的内部是基于selector(也可能是epoll)或者windows iocp来实现的,这也是为什么需要启动一个event loop,event loop可以看成是对各个平台的异步IO"等待"这个操作的封装

2.2 asyncio库

cotoutine

coroutine即为一个支持写成的函数,可以利用iscoroutinefunction来判断是否coroutine函数,这个函数需要@asyncio.coroutine来修饰

利用@asyncio.coroutine修饰以后,这个函数可以支持await(python 3.5) 或者 yield from语法,一旦执行yield from 语法以后,asyncio将会挂起当前的coroutine,去执行其他的coroutine

如下代码:

当开始运行event loop以后

1.开始执行sleep3s

2.当程序开始进入睡眠以后,event loop不会停止当前线程,而是挂起当前函数,执行下一个coroutine,即sleep5s

3.sleep5s开始进入睡眠,挂起当前的函数

4.event loop检测到sleep 3s时间已经到了,于是重新执行被挂起的sleep3s,sleep3s执行完毕

5.sleep5s时间已经到了,于是重新执行被挂起的sleep5s,sleep5s执行完毕

基于coroutine的服务器

如上图,_tcp_listen创建了一个tcp 服务器,并且收到一个tcp链接以后,创建一个_tcp_recv的任务,然后开始监听tcp连接的数据

与基于回调的库区别

coroutine版本代码在recv上逻辑处理代码是线性的而不是断裂的,基于回调的代码则经常需要乱跳,可读性较高

而且不用创建临时的数据去保存一些变量,上图中的self.tcp_clients就是因为老版本是基于回调的,需要这个数据成员去存储(懒得再自己重新写代码,这分是重构某个工具到一般时候的代码)

扩展asyncio

因为项目里面需要知道对方udp的地址,因此需要扩展sock_recv,利用socket本身提供的recv_from

看了下loop.socket_recv的源码,loop.socket_recv的

在调用之前 必须将socket设置为非阻塞,否则会报错

关键点在于add_reader这个函数将socket传送给异步IO(默认是selector),并且传送一个回调进去(在这个例子里面是_sock_recv自己这个函数,只要有数据可以读取以后,将会再次调用_sock_recv这个函数

asyncio也不止支持sleep以及io操作,还支持多进程,lock等操作

只要将上图的data = sock.recv(n)改为data, addr = sock.recv_from(n)就可以了

在3.5中,新增加了async以及await的语法,用于代替asynio.coroutine以及yield from

Python3.5 的async以及await

https://www.python.org/dev/peps/pep-0492/

python asyncio笔记的更多相关文章

  1. Web Scraping with Python读书笔记及思考

    Web Scraping with Python读书笔记 标签(空格分隔): web scraping ,python 做数据抓取一定一定要明确:抓取\解析数据不是目的,目的是对数据的利用 一般的数据 ...

  2. python学习笔记整理——字典

    python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...

  3. VS2013中Python学习笔记[Django Web的第一个网页]

    前言 前面我简单介绍了Python的Hello World.看到有人问我搞搞Python的Web,一时兴起,就来试试看. 第一篇 VS2013中Python学习笔记[环境搭建] 简单介绍Python环 ...

  4. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  5. python datetime笔记

    python datetime笔记 http://mint-green.diandian.com/post/2011-09-09/4892024 获取当前时间,并通过字符串输出. 格式为:%Y-%m- ...

  6. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

  7. python学习笔记--Django入门四 管理站点--二

    接上一节  python学习笔记--Django入门四 管理站点 设置字段可选 编辑Book模块在email字段上加上blank=True,指定email字段为可选,代码如下: class Autho ...

  8. python学习笔记--Django入门0 安装dangjo

    经过这几天的折腾,经历了Django的各种报错,翻译的内容虽然不错,但是与实际的版本有差别,会出现各种奇葩的错误.现在终于找到了解决方法:查看英文原版内容:http://djangobook.com/ ...

  9. python学习笔记(一)元组,序列,字典

    python学习笔记(一)元组,序列,字典

随机推荐

  1. hdu 4252 A Famous City

    题意:一张相片上的很多建筑相互遮住了,根据高低不同就在相片上把一座高楼的可见部分作为一个矩形,并用数字描述其高度,若一张相片上的两个建筑群中间有空地,高度则为0;求最少有多少个建筑; 分析: 输入的0 ...

  2. Java 正则表达式学习总结和一些小例子

    从Java1.4起,Java核心API就引入了java.util.regex程序包,它是一种有价值的基础工具,可以用于很多类型的文本处理, 如匹配,搜索,提取和分析结构化内容. java.util.r ...

  3. openjudge 大师兄,师傅被妖怪抓走啦

    描述 孙悟空听到沙僧大喊一句:“大师兄,师傅被妖怪抓走啦!”于是孙悟空直追白骨精而去.孙悟空在一条长度为L的森林小路上飞奔,上面有L+1个整点,依次为0,1,2……L.白骨精会使用一种大范围的攻击法术 ...

  4. 本文使用springMVC和ajax,实现将JSON对象返回到页面

    一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...

  5. Vue.js相关知识2-组件

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  6. 【BZOJ1010】【HNOI2008】玩具装箱

    继续看黄学长代码 原题: P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京.他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中.P教授有编号为1.. ...

  7. 关于正则表达式处理textarea里的换行

    将textarea里的内容存入数据库时,会自动将回车换行符过滤成空格,也会将多个空格转换成一个空格,即:将\n等换成 “  ”存入数据库 因此为了将内容从数据库中按照原来格式读出写入到html 就必须 ...

  8. caffe: test code 执行出问题: Check failed: FLAGS_weights.size() > 0 (0 vs. 0) Need model weights to score.

    Check failed: FLAGS_weights.size() > 0 (0 vs. 0) Need model weights to score. 出现这个错误,但是我记得昨天还好好的, ...

  9. JSBinding + SharpKit / 初体验:下载代码及运行Demo

    QQ群:189738580 以下是群主维护的JSB版本: git地址:https://github.com/qcwgithub/qjsbunitynew.git插件源码地址(不包含SpiderMonk ...

  10. C# typeof()实例详解

    typeof(C# 参考) 用于获取类型的 System.Type 对象.typeof 表达式采用以下形式: System.Type type = typeof(int);  备注 若要获取表达式的运 ...