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. Java自带的keytool命令

    使用Java自带的keytool命令,在命令行生成. 1.生成服务器端私钥kserver.keystore文件 keytool -genkey -alias serverkey -validity 1 ...

  2. 优测优社区干货精选|老司机乱谈编辑器之神——vim

    文 / 腾讯 吴双 前言 优测小优 有话说: 腾讯优测只有应用测试大神?不不不,我们还有各种研发大牛! *** vim 是一种信仰,我自从2004年有了这个信仰,已经12个年头了.本文介绍了学习vim ...

  3. sphinx搜索引擎架构图

  4. json数据的jquery操作和asp.net后台操作

    jquery操作 json对象创建 var item0={"a":"val1","b":"val2"}; json对象字 ...

  5. 11. Container With Most Water

    Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, ai).  ...

  6. No 11.11 in my dictionary

    今年雙十一又被坑了.被京东坑大發了,正在努力維權中. 買了大大小小將近3wCNY的商品中唯有一件,我十分滿意 羅技的G105遊戲鍵盤,雖然我不是拿來玩遊戲的. 中國人在對比國內外產品時總有1萬個理由好 ...

  7. Android——计算器

    layout文件: <?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:andr ...

  8. HDU-1561 The more, The Better (树形DP+分组背包)

    题目大意:给出一片森林,总共有n个点,并且都有权值.从中选出m个,使权值和最大.其中,选某个节点之前必须先选其父节点. 题目分析:给所有的树都加一个共同的权值为0的根节点,使森林变成一棵树.定义状态d ...

  9. Linux平台下利用系统接口函数按照行读写文件

    要求:支持大文件(1M)一次性读入 源代码如下: #include<stdio.h> #include<fcntl.h> #include<stdlib.h> #i ...

  10. display:none,overflow:hidden,visibility:hidden之间的区别

    一,display:none; 隐藏元素,不占网页中的任何空间,让这个元素彻底消失(看不见也摸不着) 二,overflow:hidden; 让超出的元素隐藏,就是在设置该属性的时候他会根据你设置的宽高 ...