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. Git简易的命令行入门教程

    简易的命令行入门教程: Git 全局设置: git config --global user.name "imsoft" git config --global user.emai ...

  2. python学习笔记 - assert用法

    [转自]http://blog.sina.com.cn/s/blog_76e94d210100vz37.html   1.assert语句用来声明某个条件是真的. 2.如果你非常确信某个你使用的列表中 ...

  3. ros与下位机通信常用的c++ boost串口应用--22

    摘要: 原创博客:转载请表明出处:http://www.cnblogs.com/zxouxuewei/ 一.首先移植c++ boost 库: 1. 先去 Boost官网 下载最新的Boost版本, 我 ...

  4. spark 分析sql内容再插入到sql表中

    package cn.spark.study.core.mycode_dataFrame; import java.sql.DriverManager;import java.util.ArrayLi ...

  5. Linux驱动设计——字符设备驱动(一)

    Linux字符设别驱动结构 cdev结构体 struct cdev { struct kobject kobj; struct module *owner; const struct file_ope ...

  6. .NET GC Server-Background-GC

    Garbage Collection and Performancehttps://msdn.microsoft.com/en-us/library/ee851764(v=vs.110).aspx h ...

  7. OAuth2.0详解

    1.使用场景 A系统存放着订单信息 B系统需要查询A系统中的订单信息,但是必须要A系统验证通过后,才能查询. 此时,我们有两种验证方式: 1)拥有A系统的账户/密码 弊端是对A系统来说,直接提供账户/ ...

  8. IPy

    IPy生成网段列表from IPy import IPip = IP('192.168.0.0/16')print ip.len()for x in ip:print (x) ip的属性,'PUBLI ...

  9. 【转】ASP.NET服务器控件使用之MultiView和View

    MultiView 和 View 控件和制作出选项卡的效果,MultiView 控件是一组 View 控件的容器.使用它可定义一组 View 控件,其中每个 View 控件都包含子控件. 如果要切换视 ...

  10. docker nodejs 基本应用

    1. 安装docker 环境 2. nodejs  应用布局 package.json { "name": "docker-centos-hello", &qu ...