python asyncio - Go语言中文社区

python asyncio


网络模型有很多中,为了实现高并发也有很多方案,多线程,多进程。无论多线程和多进程,IO的调度更多取决于系统,而协程的方式,调度来自用户,用户可以在函数中yield一个状态。使用协程可以实现高效的并发任务。Python的在3.4中引入了协程的概念,可是这个还是以生成器对象为基础,3.5则确定了协程的语法。下面将简单介绍asyncio的使用。实现协程的不仅仅是asyncio,tornado和gevent都实现了类似的功能。

event_loop 事件循环:程序开启一个无限的循环,程序员会把一些函数(实际上就是协程)注册到事件循环上。当满足事件发生的时候,调用相应的协程函数。
coroutine 协程:协程对象,指一个使用async关键字定义的函数,它的调用不会立即执行函数,而是会返回一个协程对象。协程对象需要注册到事件循环,由事件循环调用。
task 任务:一个协程对象就是一个原生可以挂起的函数,任务则是对协程进一步封装,其中包含任务的各种状态。
future: 代表将来执行或没有执行的任务的结果。它和task上没有本质的区别
async/await 关键字:python3.5 用于定义协程的关键字,async定义一个协程,await用于挂起阻塞的异步调用接口

阻塞和await

使用async可以定义协程对象,使用await可以针对耗时的操作进行挂起,就像生成器里的yield一样,函数让出控制权。协程遇到await,事件循环将会挂起该协程,执行别的协程,直到其他的协程也挂起或者执行完毕,再进行下一个协程的执行。

并发

asyncio实现并发,就需要多个协程来完成任务,每当有任务阻塞的时候就await,然后其他协程继续工作。创建多个协程的列表,然后将这些协程注册到事件循环中。

底层实现

python asyio实现单线程异步模式, 实际上底层运用了I/O多路复用方法。用户态同步I/O模拟的异步请求。
event_loop实际上就是一个I/O多路复用器,在linux上使用的是epoll.
程序员把协程函数注册到事件循环上,asyio底层首先执行系统调用返回文件描述符,比如执行网络请求,然后将该套接字描述符和回调函数等封装成一个请求。然后注册到I/O多路复用器上, 当获取到数据之后,执行回调函数,然后再将回调函数的返回值返回给协程函数。

参考:http://python.jobbole.com/87310/

版权声明:本文来源简书,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://www.jianshu.com/p/7fb655d3cde1
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-01-12 13:10:00
  • 阅读 ( 1878 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢