Sanic、uvloop及Asyncio的局限

这篇具有很好参考价值的文章主要介绍了Sanic、uvloop及Asyncio的局限。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Sanic

  • sanic使用基于libuv的uvloop事件循环替代python asnycio自带的事件循环替代,以此提高异步性能。
  • Flask和Django是同步框架,Tornado、FastApi和Sanic均为异步框架,Sanic的性能最好。
  • Sanic入门教程:Sanic:一款号称 Python 中性能最高的异步 web 框架,全方位介绍 Sanic
  • Sanic支持通过workers设置并发的工作进程,开启多进程并发后,子进程会开启多个服务,主进程内部通过路由分发实现负载均衡。

uvloop

  • uvloop是Python原生事件循环的替代品,能提高了性能。

  • 为什么提高了性能?:

    1. uvloop是基于Cython写的,执行效率更高。
    2. uvloop底层基于libuv,而libuv是高性能、跨平台的异步IO库,nodejs的事件循环也是基于libuv的。【libev介绍详见:网络io模型、同步异步及libuv】
  • 缺点:uvloop不支持Windows。

  • 即便不开发 Sanic 服务,也可以使用 uvloop 来替换 asyncio 内部的事件循环。

import asyncio
import uvloop
asyncio.set_event_loop_policy(uvloop.EventLoopPolicy())

uvloop的性能测试

  • 结论:纯uvloop的性能直逼Golang,但是Python的其他异步库可能成为性能瓶颈,如aiohttp的http解析。
  • 如果追求性能,建议使用Golang。
uvloop官方测试结果
TCP协议

这是用简单的echo服务做的测试,不能代表所有生产环境的情况。

  • 分别用1KiB数据包、10KiB、100KiB做了测试。
  • 可以看到uvloop确实牛逼,性能直逼Go。
    Sanic、uvloop及Asyncio的局限,高并发,Python,Sanic,python,架构,网络
HTTP协议
  • 【解释】:官方人员本来想用aiohttp这个Python中最常用的异步http服务库测试的。但是它的http解析器效率太低了,已然成为整个系统的瓶颈,所以他们手动实现了http-parser(起初是为Nginx设计的,所以效率非常高)的Python版本,称之为httptools。
  • uvloop对aiohttp并没有性能提升!
    Sanic、uvloop及Asyncio的局限,高并发,Python,Sanic,python,架构,网络
第三方测试
  • 参考web框架的性能排名榜:Web Framework Benchmarks
  • 使用uvloop的Sanic性能并不如Gin。

对Asyncio局限的讨论

Python基于协程的异步是为了弥补GIL对多线程并发的限制。
如果追求性能,建议使用原生支持高并发和协程的语言,如:Golang、node.js等,代价就是切换技术栈,开发成本的增加。

同步和异步代码难以统一

  • 同步和异步的语法 和 开发思路不同,导致代码维护成本翻倍。
  • 同步代码可以利用多线程并发,但是协程不是线程安全的,而且多线程会导致协程效率变差,甚至不如多线程并发效率。
  • 异步代码需要处处async/await,但是如果使用库不支持异步,仍然为io同步,也就没有意义。

大量库仍然是同步的

目前主要是很多库还是同步的。
只要有一处同步就会阻塞整个线程及其中的所有协程。文章来源地址https://www.toymoban.com/news/detail-517563.html

Python官方日志库logging

  • 直到Python3.11仍然是同步的,如果业务代码中必然大量输出日志,日志会成为整个框架或脚本的性能瓶颈。
  • 可选的异步库:
    • aiologger:star非常少,可靠性未知。
    • 注意:aiologger仅当登录到 stdout/stderr 时才完全异步。如果您登录磁盘上的文件,则您并不是完全异步的,而是将使用线程。

Python内置的Open操作文件

  • 直到Python3.11仍然是同步的,
  • 可选备用库:
    • aiofiles:star较多可靠。
      • 底层是基于线程池:aiofiles helps with this by introducing asynchronous versions of files that support delegating operations to a separate thread pool.

aiohttp库

  • uvloop的测试人员发现该库的http解析器性能很差,所有用Python把Nginx的http解析重新实现了一遍。

statsd库

  • pystatsd:该库用于向statsD服务打点,常用于搭建监控系统,配合Grafana和Graphite使用。
  • 可选的异步库:
    • aiodogstatsd:star非常少,可靠性未知。
    • udp-echo-server:使用异步框架,发送upd,自己完成封装。

参考资料

  • Python 协程系列之EventLoop
  • 你必须要会uvloop!让Python asyncio异步编程性能直逼Go协程性能

到了这里,关于Sanic、uvloop及Asyncio的局限的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python asyncio高性能异步编程 详解

    目录 一、协程 1.1、greenlet实现协程 1.2、yield 1.3、asyncio 1.4、async await 二、协程意义 三、异步编程 3.1、事件循环 3.2、快速上手 3.3、await 3.4、Task对象 3.5、asyncio.Future对象 3.5、concurrent.futures.Future对象 3.7、异步迭代器 3.8、异步上下文管理器 四、uvloop 五、实战案例

    2024年02月20日
    浏览(64)
  • Python潮流周刊#7:我讨厌用 asyncio

    你好,我是猫哥。这里记录每周值得分享的 Python 及通用技术内容,部分为英文,已在小标题注明。(标题取自其中一则分享,不代表全部内容都是该主题,特此声明。) 首发于我的博客:https://pythoncat.top/posts/2023-06-17-weekly7 1、AsyncIO (英) 文章的作者讨厌 asyncio 库,认为使用

    2024年02月09日
    浏览(72)
  • 【Web开发】Python实现Web服务器(Sanic)

    🍺基于Python的Web服务器系列相关文章编写如下🍺: 🎈【Web开发】Python实现Web服务器(Flask快速入门)🎈 🎈【Web开发】Python实现Web服务器(Flask案例测试)🎈 🎈【Web开发】Python实现Web服务器(Flask部署上线)🎈 🎈【Web开发】Python实现Web服务器(Tornado入门)🎈 🎈【Web开

    2024年02月06日
    浏览(45)
  • python conda实践 sanic框架gitee webhook实践

    /******************************************************************/ conda后台运行python脚本shell脚本run.sh: 想以www用户运行脚本,记的切换到www用户,再启动脚本, ./run.sh start #!/bin/bash #应用入口文件 APP_NAME=/www/wwwroot/python-webhook/main.py #进程 PROCESS_KEYWORD=python-webhook #使用说明,用来提示

    2024年02月10日
    浏览(49)
  • 6. Python使用Asyncio开发TCP服务器简单案例

    1. 说明 在Python中开发TCP/IP服务器有两种方式,一种使用Socket,需要在py文件中引入对应的socket包,这种方式只能执行单项任务;另一种方式使用Asyncio异步编程,可以一次创建多个服务器执行不同的任务。 2. 接口说明 3. 简单案例 创建一个tcp服务器,并实现数据的接受和发送

    2024年03月11日
    浏览(100)
  • python---------xpath提取数据------打破局限

     欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com 为什么要学习XPATH和LXML类库 什么是XPATH 认识XML XML的节点关系 常⽤节点选择⼯具 节点选择语法 节点修饰语法 选择未知节点 lxml库 _____________________________________________________________ 可以利⽤ Xpath 来快速的定位特定元素

    2024年02月09日
    浏览(38)
  • 🔥🔥Java开发者的Python快速进修指南:网络编程及并发编程

    今天我们将对网络编程和多线程技术进行讲解,这两者的原理大家都已经了解了,因此我们主要关注的是它们的写法区别。虽然这些区别并不是非常明显,但我们之所以将网络编程和多线程一起讲解,是因为在学习Java的socket知识时,我们通常会将它们结合使用,以实现服务器

    2024年02月05日
    浏览(67)
  • python里面将接口返回的json格式数据写入到数据库的两种方案及其局限性

    方案一: 使用MySQLdb或pymysql等Python MySQL数据库连接库将数据插入到MySQL数据库 方案二: 使用pandas库将JSON数据转换为DataFrame对象,然后使用to_sql()方法将数据存入MySQL数据库** 对整体的数据格式支持自定义处理,能处理较为复杂的数据格式 首先,我们使用json.load()函数将\\\"data.

    2024年02月14日
    浏览(43)
  • 【高并发网络通信架构】引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

    目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者对比 三,函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_create 方法 6.epoll_ctl 方法 7.epoll_wait 方法 8.struct epoll_event 结构体 四,代码实现 select 操作流程 s

    2024年02月12日
    浏览(58)
  • 【高并发网络通信架构】3.引入IO多路复用(select,poll,epoll)实现高并发tcp服务端

    目录 一,往期文章 二,基本概念 IO多路复用 select 模型 poll 模型 epoll 模型 select,poll,epoll 三者对比 三,函数清单 1.select 方法 2.fd_set 结构体 3.poll 方法 4.struct pollfd 结构体 5.epoll_create 方法 6.epoll_ctl 方法 7.epoll_wait 方法 8.struct epoll_event 结构体 四,代码实现 select 操作流程 s

    2024年02月14日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包