假如用 flask 或者 django(不使用异步部署)这样的框架,在视图函数中使用 asyncio,对程序的性能是有提升? 如果没有提升或提升不大或结果不可预测,那么使用 asyncio 这样的异步库对程序性能提升的前提限制都有哪些?
![]() | 1 qW7bo2FbzbC0 2021-03-03 17:58:10 +08:00 ![]() 推荐使用异步含量更高的语言 |
![]() | 2 xcstream 2021-03-03 18:02:06 +08:00 ![]() 不能 |
3 iConnect 2021-03-03 18:03:27 +08:00 via Android ![]() 喜欢 asyncio 直接用 fastapi,不要用 django 、flask 这些同步框架,框架作者都没打算上 asyncio,自己 hack 有很多问题。 |
4 acmore 2021-03-03 18:06:55 +08:00 不可预测,CPU 密集的项目用异步用处不大,比如你的项目是用来做大数质因分解的。 异步主要用于网络和高 I/O 的项目,本质就是把 CPU 傻等的那段时间拿过来利用。 你可以模拟下真实的网络环境跑个 benchmark 看看。 |
![]() | 5 clino 2021-03-03 18:10:19 +08:00 性能是不能提升的,只能提升并发数量 如果并发能用到多核,比如开多个子进程进行计算,倒是可以算是提升了性能,但是在 web 框架里用应该没有这种情况发生 |
6 superrichman 2021-03-03 18:17:06 +08:00 via iPhone 一处异步,处处异步 从 0 开始吧 |
![]() | 7 tomczhen 2021-03-03 18:19:10 +08:00 via Android ![]() 带有偏见看事物才是最有问题的,比如说 Django 都已经主推 asgi 了,到这里就变成“根本没打算上 asyncio”,再说 Python 异步生态又不是只有 asyncio 啊。 回到异步对 Python 性能提升的话题,我觉得可以看看 https://techspot.zzzeek.org/2015/02/15/asynchronous-python-and-databases/ |
![]() | 10 Vegetable 2021-03-03 18:37:59 +08:00 应该说可以在某些情况下提升效率,通过使用局部异步的方式。不过这么做和直接用多线程没啥区别。 比如这段代码 https://gist.github.com/luliangce/9f9ce635a62f4b60e3109177630b0a30 用异步的确比同步快,但其实没什么意义。 |
![]() | 11 LeeReamond 2021-03-03 18:46:34 +08:00 ![]() David beazly 在一开始讲异步的时候就很明确的总结,异步来自 Python 的另外一个宇宙( Universe ),其功能是通过维护一个事件循环,以复用的方式加速 IO 。和同步宇宙最大的区别在于异步宇宙中 func()并不像同步宇宙一样代表执行某任务,而是仅代表定义任务,执行在稍后。你想跟基于线程模型的同步 IO 混用,比如在 flask 框架里,那你要如何安排你的事件循环呢? |
12 renmu123 2021-03-03 18:50:34 +08:00 via Android Python 的异步生态还不够成熟 |
![]() | 13 love 2021-03-03 19:26:31 +08:00 via Android 异步库不是用来提升性能的吧,不觉得会比传统的同步多进程性能好 |
![]() | 14 chroming 2021-03-03 21:11:51 +08:00 via iPhone 当初开始使用 fastapi 时自己本机测了下有一点业务代码的相同接口,fastapi+uvicorn 差不多比 flask+gunicorn 快一倍 |
15 iConnect 2021-03-03 21:24:25 +08:00 via Android @chroming 有没有印象,两种测试方案下,当时 CPU 和内存的占用分别达到多少?还是都跑满测试的? |
16 todd7zhang 2021-03-04 09:15:28 +08:00 @chroming 难道不是并发多一倍而已嘛?之前业务逻辑响应要 30ms,改成异步就能 15ms 了? |
![]() | 17 abersheeran 2021-03-04 09:36:40 +08:00 @chroming 好家伙,你拿一个性能最拉跨 WSGI 框架跟一个有 C 库加持的 ASGI 框架比性能。这是让巴基斯坦打 China,铁定输啊。 要比性能,你可以换一个,比如 bottle+gunicorn+meinheld 与 starlette+uvicorn 比。一个是 WSGI 高性能的代表,一个是 ASGI 高性能的代表。 |
![]() | 18 abersheeran 2021-03-04 09:41:04 +08:00 提升的前提有这么几个:属于 IO 密集型任务( CPU 密集你只能上 C/Rust 拓展),代码里没有任何同步 IO 代码(无栈协程有传染性),原有项目使用多线程模型导致了大量的线程切换损耗(如果你用 gevent 之类的去改造过了,asyncio 不会比 gevent 更快)。 三个条件,任何一个不满足,都得不到显著的提升。这三个是必要条件,不一定是充分条件。 |
19 xpresslink 2021-03-04 10:12:04 +08:00 以海底捞火锅举例,性能是由台数决定的,门口等座椅子数量只能决定能拖住多少客人暂时不走。使用异步只是提高了等座椅子数量,最终决定性能的还是要靠 CPU 、磁盘、网络 IO 的处理能力。 |
![]() | 20 wangyzj 2021-03-04 11:35:26 +08:00 io 密集型可以提高并发,还是要快一点 |
21 mlbjay 2023-07-21 15:00:38 +08:00 python 的 asyncio 是纯用户态线程,同步 io 会阻塞整个线程及其中的所有协程。 Golang 的 MPG 就解决的这个问题。 |