Python中异步请求框架选择:aiohttp+uvloop 与 asyncio+tornado 对比?
有没有伙伴比较一下两者的优劣势
Python中异步请求框架选择:aiohttp+uvloop 与 asyncio+tornado 对比?
没有可比性
对于Python异步请求框架的选择,aiohttp+uvloop和asyncio+tornado都是成熟方案,但适用场景不同。
aiohttp+uvloop组合:
- aiohttp是专为asyncio设计的HTTP客户端/服务器框架,API设计现代简洁
- uvloop能显著提升事件循环性能(接近Go语言水平)
- 适合:纯异步HTTP服务、需要高性能的API服务、微服务架构
- 代码示例:
import aiohttp
import asyncio
import uvloop
async def fetch(session, url):
async with session.get(url) as response:
return await response.text()
async def main():
async with aiohttp.ClientSession() as session:
html = await fetch(session, 'http://httpbin.org/get')
print(html[:200])
if __name__ == '__main__':
uvloop.install()
asyncio.run(main())
asyncio+tornado组合:
- Tornado本身是完整的Web框架,自带HTTP服务器和异步客户端
- 从Python 3.3开始支持asyncio,可以混合使用两种协程
- 适合:需要WebSocket支持、长连接应用、已有Tornado代码库迁移
- 代码示例:
import asyncio
from tornado.httpclient import AsyncHTTPClient
async def fetch_tornado():
http_client = AsyncHTTPClient()
try:
response = await http_client.fetch("http://httpbin.org/get")
print(response.body[:200])
except Exception as e:
print(f"Error: {e}")
if __name__ == '__main__':
asyncio.run(fetch_tornado())
核心对比:
- 性能:aiohttp+uvloop在纯HTTP性能测试中通常更快
- 生态:aiohttp生态更专注于异步,Tornado生态更全面
- 学习曲线:aiohttp更符合现代Python异步编程习惯
- 兼容性:Tornado对传统同步代码兼容更好
建议:新项目优先考虑aiohttp+uvloop,已有Tornado项目可逐步迁移到asyncio。
什么是异步请求,应用场景是什么?
treq
为啥不考虑 gevent 了?
gevent +1
不是说 uvloop 性能最好吗?
不是说 uvloop 性能最好吗?
两种都用啊 区别不大
肯定是 twisted 事件循环,回归本质才能把控自如。
gevent
tornado asynci 都是坑
aiohttp + uvloop
老哥能不能说一下坑在哪儿?
自写事件循环跟 http 库的路过。
twisted/futures/Rx 都行.
python 异步感觉搞不起来,都转 golang 去了
uvloop 或者 tornado 都好,在 linux 上面还是调用 epoll 的,IO 复用的东西就不要想这么多,他们在事件循环方面没有数量级的差别。你考虑一下你的 http parser 或者 json serializer 更好了,这些 CPU 密集型的事情更容易影响性能。
不过既然你问这个,大概这些影响对于你来说都是没有的。你熟悉哪个就用哪个就好了。
uvloop 不就是用 libuv 实现了 asyncio 那套 API 嘛,libuv 提供的一些强悍的东西 uvloop 又提供不了。都站在 Python 那么高的抽象层了,那么就多想想两个框架哪个更适合自己的业务更好了。
就目前看来,tornado 在网络编程方面对长连接应该好。如果需要基于 UDP/TCP 的业务,那么上 Tornado,基础更好,更成熟。
至于基于 http 的,随便选,都一样。
好的
当然是 uvloop 了,
来源于这篇文章: https://magic.io/blog/uvloop-blazing-fast-python-networking/


