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

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

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

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

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

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

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

15787 次点击
所在节点    编程
153 条回复
zhanlanhuizhang
2021-04-20 19:52:20 +08:00
异步:就是新建一个线程处理(就是多线程)。怎么会把网站卡住。除非你用了同步。
ReferenceE
2021-04-20 19:58:33 +08:00
一处异步,全部异步
习惯就行问题不大
不过不写 Python,TAP 模型挺顺手
xuanbg
2021-04-20 20:43:32 +08:00
单线程的情况下,无论异步还是同步,一处阻塞就全卡住。这是单线程的问题,不是异步的问题。
helloworld000
2021-04-20 20:49:51 +08:00
看了快 100 楼了,没人说 Twisted ?

虽然 py async 确实不怎么样,但是 Twisted 还是要提的
Muninn
2021-04-20 20:55:45 +08:00
@balabalaguguji go 学起来没有比 python 难太多。解释起来就太复杂了,直接学起来试着写写就懂了。 推荐这篇文章吧: https://tonybai.com/2017/04/20/go-coding-in-go-way/
billlee
2021-04-20 21:04:10 +08:00
java 不就是典型的多线程异步
iseki
2021-04-20 21:10:54 +08:00
同步阻塞模型下往往会开一堆线程,这其中的同步并发安全问题也会带来极大的心智负担。纵然异步非阻塞模型下往往也都不是单线程的,但心智负担远没有这么大,很多时候核心部分处理正确就没问题了
liuhan907
2021-04-20 21:32:10 +08:00
你这标题应该改叫做 “在一堆技术菜的抠脚程序员维护的老项目里引入单线程异步的缺点” 才贴切。不然你让 go/c#/kt/rust 等等等一大票良好支持多线程异步的语言脸往哪搁啊。连 C++都有多线程协程了。
hejingyuan199
2021-04-20 21:38:46 +08:00
看楼主发言,我感觉我理解错了同步 /异步、IO 阻塞 /非阻塞。
看下面回复,我发现好像楼主表达不是很清晰。不过楼主知道自己在说什么。

“异步因为只有一个线程”这句话给我整懵了。
都异步了,为什么才一个线程?都异步了,说明两件事情同时进行了,那应该在两个线程上或者两个进程上吧。只不过,如果是单核,那么需要分时处理。如果是多核,那就是真正的同时进行,一个核上跑一个。

后面我就更看不懂了。

如果我有理解错误,请原谅,只是基于自己的理解参与一下讨论。
ipwx
2021-04-20 21:48:16 +08:00
我个人觉得多线程更难搞。。。
akira
2021-04-20 21:57:53 +08:00
同步的优点 = 异步的缺点
异步的优点 = 同步的缺点

应该是这样 没错吧
lujjjh
2021-04-20 22:13:47 +08:00
在写 GUI app 的时候都会注意不要 block 主线程,不然会导致 event loop block 住,整个 UI 就卡死了。你说的其实也是这个意思。

node.js 和 Python 里基于绿色线程的各种框架,event handler 不会跑在单独的线程 / 进程里,所以一旦业务函数 block 住,其他请求就进不来了。

node.js 相对 Python + gevent 来说心智负担小很多,对于会 block 住 I/O 的函数,标准库里基本会标明 xxxSync 。然而并没有办法阻止其他人或者直接 /间接依赖使用 xxxSync,除非 review 包括依赖在内的所有代码。所以我倾向于这个问题是没法完全避免的。

那怎么办?其实不必过于担心这个问题,一般写业务,能产生 I/O 的地方也就那么几种类型,选择好对应的库就可以了。对于其他场景,比如写基础设施(写基础设施真的会用 Python 么?),code review 能杜绝大多数问题,主要看能产生 I/O 的地方。剩下的就交给压测了,这种明显会产生性能瓶颈的地方绝对是可以压出问题来的。
alvins
2021-04-20 22:32:55 +08:00
不能基于语言说基本概念,只是你恰好碰到的是不那么完美的
NilChan
2021-04-21 02:49:27 +08:00
异步同步和线程是一个概念吗?
domodomo
2021-04-21 06:33:09 +08:00
异步最大的缺点就是对设计和编写的要求比较高,一不小心很容易把整个项目搞砸。
dbpe
2021-04-21 08:49:53 +08:00
balabalaguguji
2021-04-21 09:05:38 +08:00
@carity #73 很多人都不知道这个情况的,以为可以随便写代码,实际上异步只有 IO 是异步,其他逻辑都是同步的,一卡就所有都卡死了
balabalaguguji
2021-04-21 09:07:18 +08:00
@zwy100e72 #75 嗯,也有人攻击,不过我虚心跟他们请教,所以没吵起来,毕竟每个人的知识面不一样,用的语言不一样,理解也会不一样
balabalaguguji
2021-04-21 09:08:02 +08:00
@luoqeng #76 嗯,对 golang 产生了很大的兴趣
balabalaguguji
2021-04-21 09:09:23 +08:00
@jones2000 #77 是的,就像我说的,如果不是有很大的性能要求,简简单单的用多线程框架简单很多。

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

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

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

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

© 2021 V2EX