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

18 天前
 wudanyang

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

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

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

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

5938 次点击
所在节点    Python
73 条回复
fkdtz
18 天前
提出这样的问题,估计是没搞清楚协程适合于什么场景,甚至根本没理解什么是协程。

直接回答问题:能跑,不但跑的很好,而且效率非常高。

但前提是你真的理解协程在干嘛。

如果你理解了,那么几乎不会出现你说的忘了写 await 的情况,就像你定义函数时不会忘了写 def 一样,就算有 1%的概率你加班三天三夜没合眼真的忘了,那么运行起来必然出错,因为 awaitable 的对象必然不等于你期望的结果。

我觉得标题改成,不熟悉 Python 协程的情况下,能直接干生成环境吗?那么答案是不能。

🙏
shimada666
18 天前
2 确实巨坑,之前用 openai 的同步 Client: OpenAI() 就把其他卡住了。改错了 AsyncOpenAI() 才正常
way2explore2
18 天前
我有用啊,在生产环境
cj323
18 天前
我的代码比较老,之前尝试过 asyncio 确实阻塞过,加上写法很繁琐+老代码又不支持。

后来 gevent.monkey_patch_all ,反倒没出过事。
cj323
18 天前
CPU 密集的 py 代码我会尽量避免 asyncio ,写着舒服多了。这种代码也往往本身也会接 message queue ,就天然 async 了。
conn457567
17 天前
相反我认为协程是 web 领域的趋势
wangritian
17 天前
让我想到 php-swoole ,早期的协程存在一模一样的问题,后来仿照 go 加入了抢占式调度
go 的混合协程确实很棒
wangtian2020
17 天前
公司用 python 写后端,新来的同事接口异步同步的问题调了几天了才勉强能用。不如 nodejs 异步单线程一根毛,nodejs 想阻塞都难
yb2313
17 天前
诶, 你忘了写单测不就通过不了吗? 这为什么会发现不了, 还是说你写好一个功能完全不测试就上正式服了?
crackidz
17 天前
第一个没有 await 可以用 type check 工具检查出来的,如果你本地使用或者 CI pipeline 里有,很容易可以检查出来。实在不行,你可以从日志捕获里抓 was never awaited 这个 Warning 也能发现
第二个是确确实实的问题,没什么很好的办法解决。选库和与别人协作的时候巨容易踩的一个坑,目前我们是加响应时间监控解决的,存在有超长时间返回的请求都需要确认一下是不是有性能问题
第三个应该和哪种都没关系,除非不用 Python 或者多进程... 或者等 Python 3.14 以后版本的 free threading 来解决
sazima
17 天前
第二个,没适配的方法放线程池执行
maggch97
17 天前
python 就不应该出现在生产环境
yh7gdiaYW
17 天前
@Vegetable 看来你并没有公司级的 python 生产经验,不过现代确实也没多少公司用 python 搞 web...开源的库都好说,公司私有 pypi 的库就没那么老实了
sharpless
17 天前
啧啧,一说到编程语言,就非争个高下,不适合这个 不适合那个,这个不行那个不行,来各位讲讲自己用自己的梦中情语搞出了多大的项目吧,日活、并发、业绩
julyclyde
17 天前
忘了写 await 的话连返回类型都不对,变成返回一个 coroutine 了

你能不能先写几句再来提问啊?
Vegetable
17 天前
@yh7gdiaYW 你这么说还挺武断的,我做的挺多的。
内部库默认是自己的代码,既然你已经引用了,证明这东西要不就是属于你自己的版本,要不就是已经上线验证过,总之是获得了自己的信任才会踩坑。
清楚自己引用的方法会不会产生 IO,是否兼容异步,是编写异步代码最基本的要求,这方面的不小心根本是不可原谅的,没有办法将责任推给其他人。
bitmin
17 天前
还行吧,我们小小公司每天流水几百万的小小项目正在用着,啥语言啥框架能没坑呢
clemente
17 天前
升级到 python3.14 这个问题就不用你解决了
dzdh
17 天前
为啥没有 vue native 呢
wudanyang
17 天前
@julyclyde #55 是我描述错误,可以看下附言

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

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

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

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

© 2021 V2EX