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

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

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

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

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

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

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

15787 次点击
所在节点    编程
153 条回复
balabalaguguji
2021-04-21 09:11:14 +08:00
@xiubin #79 不用异步那就是多线程模型,每个用户进来都是一个独立的线程,卡死也是卡死他自己的,其他人不受影响,而异步是所有人都受影响,这个估计很多新人是不知道的。死循环只是一个卡死的举例
balabalaguguji
2021-04-21 09:12:36 +08:00
@zhanlanhuizhang #81 你似乎理解错了异步,我说的是 nodejs 的那种 IO 异步,只有一个主线程,没有多线程
balabalaguguji
2021-04-21 09:15:28 +08:00
@xuanbg #83 没有 web 服务器是同步还用单线程的吧,现在流行的就两种,异步和多线程
balabalaguguji
2021-04-21 09:16:33 +08:00
@helloworld000 #84 了解过 tornado,你这个没怎么去了解
Visionhope
2021-04-21 09:17:48 +08:00
其实异步更简单, 只是大家入门的时候, 最熟悉的就是基于多线程的编程方式, 不熟悉你所说的 python 里面的 asyncio 那种异步编程方式, 归根到底只是个熟悉程度的问题.
balabalaguguji
2021-04-21 09:18:15 +08:00
@Muninn #85 我考虑最多的是 go 的包有没有 python 和 nodejs 的多,现在 pip 和 npm 第三方库很多,要啥有啥,很方便
charlie21
2021-04-21 09:18:38 +08:00
在面向 API 编程解决具体问题时,异步编程有自己一套 API,但是在某个具体事情上使用了这套 API 就要了解它的开销,而不同运行时的开销是不一样的。C# 异步背后是线程池,JS 异步背后是事件循环,golang 背后说什么阿 反正和前两个都不一样

故而你应该指明你聊的运行时是什么
balabalaguguji
2021-04-21 09:19:27 +08:00
@billlee #86 java 没怎么用,能多线程+异步 IO,感觉很好
balabalaguguji
2021-04-21 09:21:52 +08:00
@liuhan907 #88 嗯,仅限 nodejs,python 语言,其他语言我不了解
wuwukai007
2021-04-21 09:22:05 +08:00
可以通过 rpc 解耦,不支持异步的库,走 rpc
balabalaguguji
2021-04-21 09:25:22 +08:00
@hejingyuan199 #89 我不知道你是不是用 nodejs 或者 python,如果是,那你是理解错了,那我这篇文章提醒到了对的人。异步只有 IO 为异步,只有一个线程,时间切换来达到异步的,并不是创建了多个线程,多个线程的那叫多线程了。
balabalaguguji
2021-04-21 09:26:40 +08:00
@ipwx #90 嗯,这个看个人对哪个更加熟悉,没有答案。我尽到提醒大家异步需要主意的点就行。
balabalaguguji
2021-04-21 09:29:49 +08:00
@lujjjh #92 对,也就是我说的对代码和人员要求高了,要多 review,多测试,多发现 sync 代码,时刻提醒自己别搞出 block 代码了
balabalaguguji
2021-04-21 09:31:34 +08:00
@domodomo #95 到位,是我这个意思。我就是某天不小心写了个同步 IO 调用,卡死了整个网站,所以来提醒大家。
balabalaguguji
2021-04-21 09:32:33 +08:00
@wuwukai007 #110 你要等返回结果呢?
balabalaguguji
2021-04-21 09:33:50 +08:00
@charlie21 #107 嗯,后面补充了是聊 nodejs 和 python
Actrace
2021-04-21 09:49:14 +08:00
😂本质上来说所有的多任务都是模拟的,都是需要分时的。
所以我个人认为编程语言最重要是,面向用户时,提供足够简单易懂的使用方法。具体实现时,实现足够优秀的性能(但是用户不需要知道它怎么做到)。

所以很多时候,真的是要根据场景来决定编程语言,哪个简单用哪个就完了,甚至对于不同的人都是这样,你觉得顺序编程好理解,那就顺序编程,你觉得异步编程好用,那就异步。没啥好纠结的。
bleepbloop
2021-04-21 09:49:15 +08:00
建议多学习
LessonOne
2021-04-21 10:25:46 +08:00
@balabalaguguji 不懂就不要误人子弟 每个用户一个线程 那你的服务器不是要爆?
czzhengkw
2021-04-21 10:32:47 +08:00
低情商:我来说说异步框架的最大缺点
高情商:使用异步框架碰到这些问题,请问要怎么解决

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

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

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

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

© 2021 V2EX