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 5187 zhx's contest

    题目分析如果n=1,答案是1,否则答案是2n−2. 证明:ai肯定是最小的或者最大的.考虑另外的数,如果它们的位置定了的话,那么整个序列是唯一的. 那么ai是最小或者最大分别有2n−1种情况,而整个序 ...

  2. POJ 3259 Wormholes (Bellman_ford算法)

    题目链接:http://poj.org/problem?id=3259 Wormholes Time Limit: 2000MS   Memory Limit: 65536K Total Submis ...

  3. c 函数及指针学习 10

    标准库函数 1算数运算stdlib.h 2随机数stdlib.h 3字符串转化stdlib.h 4数学函数 math.h 5日期和时间 time.h 6信号 signal.h 7打印可变参数列表std ...

  4. 安装sklearn时出现 "ImportError: DLL load failed" 的解决方法

    如果sklearn是从 http://www.lfd.uci.edu/~gohlke/pythonlibs/#scikit-learn 中下的whl包装的 必须装他家的numpy+MKL库.如果你装的 ...

  5. UVa 12100打印队列(队列)

    原题链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

  6. Java—面向对象—构造方法及相关思维导图

    先构造一个Book类的代码 package org.hanqi.pn0120; public class Book { //构造方法 //1.方法名和类名一样 //2.没有返回值,不需要加void / ...

  7. js里的原型

    <script type="text/javascript"> function People(name){ this.name = name; //对象方法 this ...

  8. 关于CPU Cache -- 程序猿需要知道的那些事

    本文将介绍一些作为程序猿或者IT从业者应该知道的CPU Cache相关的知识 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢钧轶(cenalulu) 本文原文地址:http://ce ...

  9. AIDL Service Android进程间通信机制

    转载出处:http://www.apkbus.com/home.php?mod=space&do=blog&uid=664680&id=59465 我们知道,在Android ...

  10. 【转】使用itms-services从浏览器发布iOS App遇到的问题总结

    itms-service是apple为iOS企业用户($299)提供的无线分发安装方式所使用的协议,使用这种方式发布应用不需要通过App Store,任何iOS设备都可以安装企业用户通过这种方式发布的 ...