我来说说异步框架的最大缺点

2021-04-20 16:04:09 +08:00
 balabalaguguji

异步大家都在夸,都在说他的好处,但是似乎没人说过他的最大缺点,我来说说吧,避免踩坑。

异步因为是只有一个线程,如果有一个地方阻塞了,那整个网站全部都卡住了(多进程的另说),所以你得时刻记得,如果会阻塞的方法,就得用异步的库。另外还得确保别写出死循环的逻辑,不然也是卡住整个站。

异步现在支持最好的应该是 nodejs 吧,各种异步库都有,但是 python 的支持就少很多了,如果用 gevent,猴子补丁不能帮你把所有的接口都补成异步的,所以你得清楚什么方法是可以用的,例如 commands 这个就不能用,没打补丁,可以改用 subprocess 。

写异步的代码时得时刻提醒自己以上问题,但是如果用多线程模型,就不用担心这些,如果你的网站不是特别大的访问量,可以使用多线程模型,够简单;如果是需要高并发,有大量用户,可以用异步框架并始终记住不要用阻塞方法。

如果说得不对的地方,请大家指点。

15109 次点击
所在节点    编程
153 条回复
balabalaguguji
2021-04-20 16:33:03 +08:00
@LeeReamond #17 或许你不用跟线程比较,就说写异步代码最需要注意的是什么,是不是我说的这个。
shuax
2021-04-20 16:38:48 +08:00
等一个:“我来说说多线程框架的最大缺点”
qW7bo2FbzbC0
2021-04-20 16:39:55 +08:00
楼主说的是 func()
或者 await XXXAsync()
这种异步阻塞


想要的是 go func()
或者 XXXAsync()
这种 异步非阻塞吗?
GM
2021-04-20 16:39:58 +08:00
@balabalaguguji 对员工要求高了不少,这也是我认为会很难推广起来的原因。
Jirajine
2021-04-20 16:43:03 +08:00
先分清楚异步 /同步 io 、异步 /同步编程范式、async/await+future 模型、抢占式 /协作式多任务调度模型等概念之间的联系和区别。
推荐阅读这篇 https://os.phil-opp.com/async-await/ 只看前面与语言无关的部分就可以了。
hronro
2021-04-20 16:46:53 +08:00
异步可不一定是单线程的,也有 m:n 的多线程的实现,比如 Go 。所以你说的一个地方阻塞了,整个服务全部卡死,这种情况只能说某些异步的实现确实这样(比如 Node.js ),但你不能说异步都是这样的。
另外有些人说的异步比多线程心智负担大,我不太认同。可能有很多人对多线程的认知远远超过异步的,所以对他们来说异步确实比起多线程要难理解一些,但如果是对异步和多线程两个概念都不怎么了解的新手来说,我个人觉得异步还是比多现成要多线程的心智负担要小一些的。
balabalaguguji
2021-04-20 16:47:26 +08:00
@shuax #22 你来一个吧。其实我的重点是说异步需要注意的点,不小心引起异步跟多线程的比较战。
balabalaguguji
2021-04-20 16:50:53 +08:00
@hronro #26 嗯,我对 go 还没了解过。确实可能每个人对线程和异步的熟悉度不一样,可以忽略两个的比较吧,重点是告诉大家异步需要注意的点。
keepeye
2021-04-20 16:52:03 +08:00
对人员要求高?能高到哪里去啊... 这都无法把控还是不要招进来的好
QiShine
2021-04-20 16:54:55 +08:00
异步阻塞其实更符合人对世界的直觉,比同步更容易理解
Jirajine
2021-04-20 16:57:42 +08:00
另外再补充一个所谓“多线程模式”(即抢占式调度)在某些方面反而可能有更大的心智负担
https://vorpus.org/blog/notes-on-structured-concurrency-or-go-statement-considered-harmful/
协程模式在这个问题上要稍微好一点。
ungrown
2021-04-20 16:58:45 +08:00
@shuax #22 线程开销
没了
TypeError
2021-04-20 17:12:06 +08:00
了解的太少
python 异步你都没了解全
balabalaguguji
2021-04-20 17:28:43 +08:00
@TypeError #33 可以指点下哪里理解不到位,虚心学习
balabalaguguji
2021-04-20 17:29:21 +08:00
@TypeError #33 玩过 tornado,后面找异步库太麻烦放弃了。
seakingii
2021-04-20 17:32:34 +08:00
作者你这水平,还是不要随便发现什么结论比较好
balabalaguguji
2021-04-20 17:38:58 +08:00
@seakingii #36 有哪里说得不对你可以指出来
passerbytiny
2021-04-20 17:40:24 +08:00
没事不要下大结论,你这异步,是特定语言的异步组件,而不是异步编程。“异步只有一个线程”,可是吓死我这个 Java 开发了。

综合楼主和楼上的回复,楼主说得异步,应该是单“主”线程异步框架,这些框架应该是托胎与 GUI 框架上的异步模型。如果你做过.NET 应用开发,你就会发现,主要用在 GUI (或交互部分)的异步,和主要用在服务部分的多线程,是要同时用的——二者压根就不是对立的。
aper
2021-04-20 17:40:51 +08:00
单线程异步最大缺点是中间不能穿插任何阻塞 IO 操作,比如请求 DB,rtt 是 1ms,QPS 最高也就到 1000,还不包括其他业务逻辑
tairan2006
2021-04-20 17:42:55 +08:00
建议楼主发 python 节点…

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

https://www.v2ex.com/t/771935

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

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

© 2021 V2EX