1. 前言
协程中不能写阻塞的代码因为异步编程遵旨就是要异步,所有的都要异步
,所以就不能使用阻塞的代码和库,如requests, pymysql等,非得使用也可以,异步+多线程的方式仍然有效(在前面文章中讲解过了)。但是我们都希望所有的代码都可以使用异步完成,这就促使开发者必须基于异步去改造或者创造新的库或者框架等,目前异步编程生态圈正在逐步完善,我们完全可以使用它们。
2. 异步web框架
- Tornado
Tornado在2009年发布,从一开始就提供有异步编程的功能。Tornado不仅仅是Web框架,同时它内置了很多异步模块,可用于自己构建异步应用。这些模块包括:
- 协同程序和其他原语(tornado.gen,tornado.locks,tornado.queues等)
- 网络模块(tornado.ioloop,tornado.iostream等)
- 异步服务器和客户端(tornado.httpserver,tornado.httpclient等)
通过这些模块,Tornado构建了自己的异步Web框架模块。
- FastAPI
FastAPI似乎是异步Python框架里功能、文档最丰富的框架。它语法简单,自动生成API文档,而且性能在某些情况下可以与Go相匹配。总而言之,我真的有一种感觉,FastAPI将成为Python的顶级异步框架。
- Sanic
Sanic只支持3.6以上Python版本,支持通用的async/await语法,开箱即用,因此你无需阅读大量文档就可以写出你的一个HTTP处理器。
Sanic可以说是Python世界中最流行和最受欢迎的异步框架。它具有你项目中需要的所有功能:路由,中间件,Cookie,版本控制,蓝图,基于类的视图,静态文件,流,sockets,此外你还可以集成模板,数据库驱动,文件I / O,队列等等。
3. 异步库
- Aiohttp
Aiohttp是基于python和asyncio的客户端/服务端异步网络请求库,对应于同步网络请求库是requests,所以在异步编程中想要请求网络接口,那么必须使用异步网络库,而Aiohttp是首选的。
- Aiomysql
Aiomysql是基于python和asyncio的异步mysql客户端库,它依赖并重用Pymysql大量功能,所以你可以在异步编程中像使用同步编程的方式编写异步代码。
- Aioredis
Aioredis是基于Python和asyncio的异步redis客户端库,里面也是复用大量redis的操作,所以在创建redis pool的时候一定要用异步的方式去创建。
4. 异步IO
- gevent
greenlet + libevent(后来是libev或libuv)。通过协程(greenlet)和事件循环库(libev,libuv)实现的gevent使用很广泛。
- twisted
是事件驱动的网络库。
- asyncio
Python3.4加入了asyncio库,使得Python有了支持异步IO的官方库。这个库,底层是事件循环(EventLoop),上层是协程和任务。asyncio自从3.4版本加入到最新的3.7版一直在改进中。
- async/await
Python3.5引入了两个新的关键字await和async用来替换@asyncio.coroutine和yield from,从语言本身来支持异步IO。从而使得异步编程更加简洁,并和普通的生成器区别开来。
- uvloop
uvloop是用Cython写的,基于libuv这个C语言实现的高性能异步I/O库。asyncio自己的事件循环是用Python写的,用uvloop替换asyncio的事件循环让异步程序运行速度更快,并且使用也相当简洁。
5. 小结
以上所有异步知识没必要都深入了解,只需要关心自己需要用到的就可以了,因为技术在不断更迭,等你花时间都掌握了之后,这个时候如果一旦出现新的技术可以替代老技术的时候,那么你之前积累的将会无用武之地,所以按照需要学习,把时间花在底层和长期技术投资上,这样不管后来技术如何变迁,透过表象看本质都是一样的。