Python 的 async 协程当前真的能跑在生产环境吗?

18 天前
 wudanyang

python async 启动协程时,如果当前协程不主动 await 释放,那就会一直占用事件循环,其他协程无法执行。

能想到的一些非常有风险的点:

  1. 程序员忘了写 await ,单纯靠 cr 很难完全发现,导致阻塞
  2. python 第三方库没有做 async 改造,不小心用了,导致阻塞
  3. 有可能本地运行时间短,到了线上数据量大了,阻塞时间变长

问了 ds 和 chatgpt , 看起来都没有很好的解决方案

5926 次点击
所在节点    Python
73 条回复
w568w
18 天前
@w568w 另外协程的这些问题不影响吞吐量,只影响延迟。所以说其实只有延迟敏感的应用才需要担心
dcsuibian
18 天前
那 Python 直接使用多线程模型不行吗?
wudanyang
18 天前
@w568w #21 是的,如果是 web server ,其中一个请求阻塞了 1 分钟,其他请求都会跟着阻塞 1 分钟
wudanyang
18 天前
@dcsuibian #22 也是可以的
zhuangzhuang1988
18 天前
https://docs.python.org/zh-cn/3.13/library/asyncio-dev.html
asyncio 官方还是有一些检查工具的.

我目前都是用的 anyio
有 async with group 不怕少 await.
wudanyang
18 天前
@zhuangzhuang1988 #25

官网说法:

> ## 运行阻塞的代码
> 不应该直接调用阻塞( CPU 绑定)代码。例如,如果一个函数执行 1 秒的 CPU 密集型计算,那么所有并发异步任> 务和 IO 操作都将延迟 1 秒。

> 可以用执行器在不同的线程甚至不同的进程中运行任务,以避免使用事件循环阻塞 OS 线程。 请参阅 loop.run_in_executor() 方法了解详情。

问题是,当前运行很快,有可能上线一段时间后需要执行 1 秒了
aloxaf
18 天前
你说的缺陷确实客观存在,甚至在很多语言中都存在。

但我不理解为啥存在这些缺陷就不能上生产环境了,难道有啥语言是完美无缺的、用它写的代码一定能 100% 无 BUG 运行?
neoblackcap
18 天前
所有的问题其实都可以封装一层来解决,API 接口只做最简单的请求以及参数校验,然后直接将业务处理通过可控的异步方法发给后方的工作线程池或者任务队列。并发是上去了,但是会伴随着每个请求的延迟变高。

系统跟语言是两个不一样的东西,两者没有什么直接关系。比如提出的第二点,那么我说如果第三方库出 bug ,导致线程死锁了。这不也有风险嘛。这压根就不是什么语言导致的问题。

想构建一个健壮的系统,还得多测试,多几套备用方案。指望一个框架,一种语言解决全部问题,那么跟把它当成银弹有什么区别?
l4ever
18 天前
多 worker 啊, php 不也是这样么?
xuwen
18 天前
vllm ,sglang 这些框架就是用 fastapi 啊,用的是 asyncio 。至于第三方库只有同步没有异步,完全可以使用 asyncio.to_thread 封装。而多个 coroutine 可以用 asyncio.gather 并发
ClericPy
18 天前
看懂了,也遇到过,例如

写了个 def 里面有 time.sleep 之类的同步阻塞函数,或者像 HtmlParser 这种计算密集型入参是个十几万字符的 HTML ,把 CPU 吃满了不释放,导致把主线程阻塞住,事件循环罢工了

没啥办法,一开始设计的时候就这样,mypy 、ruff 什么的有的能提示有的认不出来,至于大模型 code review 效果也一言难尽

林子大了什么鸟都有,代码长了见过的没见过的 bug 到处都是,遇到修吧

很多 route 不运行也发现不了它阻塞,以前 gevent 环境里被某个 mysql 的 C lib 阻塞住,也是找了一天才看到然后扔到 thread 里

很多 golang 玩家喜欢炫耀的就是他们家原生并发快乐,曾经尝试过模仿 golang 那套造轮子,结果不是出 bug 就是 pickle 失败,或者性能不增反降,最后:我都用 Python 了,慢点就慢点
574402766
18 天前
这些问题是这一类协程实现都有的吧 不只是 python 的 asyncio 会出现
yh7gdiaYW
18 天前
@Vegetable 你没法直到哪个第三方库间接旧用了非 async 的 io ,所以说是巨坑,除非你的项目简单没这么多层依赖
Vegetable
18 天前
@yh7gdiaYW 一个库如果不声明自己兼容异步,那就默认全都是阻塞。至于一个阻塞方法使用者怎么处理是自己的事情。我倒是没见过什么第三方库声称自己兼容异步但是实际上内部有阻塞操作。
flowkidtw
18 天前
我们团队在生产环境中使用了 asyncio ,目前没有遇到过稳定性问题。每种方案都可能有缺陷,是否可靠更多的还是取决于人。
molika
18 天前
一点问题都没有 . 线上跑的嗷嗷的. 访问量很大.
第一点 不会. 不 await 不会执行. 如果是耗费大量时间 的运算 说明 这个方法不适合 async 需要丢到多进程. 要知道 async 的适合的场景.
第二点 没办法. 尽量找到带 async. aio 的库 . 并且做好改造的准备.
ManjusakaL
18 天前
Node.js 能真的跑在生产上吗?
LostPrayers
17 天前
跑不了一点,之前一个小服务用 python+fastapi 写的,真的不适合并发环境。
后来改回 golang 写服务,然后在 go 协程里 shell 执行 py 脚本了
9hills
17 天前
协程的体验中,我觉得 Golang 是最舒服的。
mayli
17 天前
那你这个是生态或者程序员的问题了

类似问题

python 当前真的能跑在生产环境吗?
程序员写的代码真的能跑在生产环境吗?
性能差的代码真的能跑在生产环境吗?

py 问题是灵活性太大,程序员很容易踩坑,但是不代表一定会踩,2 3 的确会有问题,不过 2025 年了,库的 bug 少很多了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1140935

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX