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

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

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

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

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

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

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

15069 次点击
所在节点    编程
153 条回复
mongodb
2021-04-20 16:05:28 +08:00
“但是 python 的支持就少很多了”

不是这样的。
abersheeran
2021-04-20 16:07:22 +08:00
我觉得你不要把协程和异步 IO 混在一起比较好。
balabalaguguji
2021-04-20 16:07:39 +08:00
@mongodb #1 可能是我没找到或者比较难找。另外 redis 和 mongodb 这些的异步库感觉都不好用,都是回调的,写起来不方便
GM
2021-04-20 16:07:48 +08:00
这个确实是最大的问题,一处异步,全链路被迫全部异步,一不小心就 over,对团队的要求相应变高。
Jooooooooo
2021-04-20 16:08:11 +08:00
LeeReamond
2021-04-20 16:09:07 +08:00
很显然如果如你所言的“缺点”确实发生,那么意味着你连自己写的工程之中实现细节都无法把控,哪些接口是同步异步搞不清楚,且还有可能出现“死循环逻辑”。这种情况这边的建议是不要做工程,而不是说异步有什么缺点...
leopod1995
2021-04-20 16:09:48 +08:00
建议百度
`怎样理解阻塞非阻塞与同步异步的区别?`
Ariver
2021-04-20 16:12:11 +08:00
janxin
2021-04-20 16:13:05 +08:00
看标题就猜到是 Python 2333
balabalaguguji
2021-04-20 16:14:33 +08:00
@LeeReamond #6 相比多线程,这个对代码要求提高了很多,人员素质也要求提高,团队的每个人都得清楚自己写的会不会阻塞。另外有时候方法调用来调用去,是有可能出现死循环调用的,不是你理解的直接一个 while true 。
wanguorui123
2021-04-20 16:14:50 +08:00
异步最大的问题就是:
1 、同步循环容易阻塞主线程,需要用异步的思维来处理循环计算
2 、所有地方都要写成异步,不然容易混乱
balabalaguguji
2021-04-20 16:14:52 +08:00
@GM #4 是这个意思
balabalaguguji
2021-04-20 16:15:58 +08:00
@wanguorui123 #11 对,但是我以前没见过有人说过这些注意点,我自己踩过坑才知道,所以对人员要求是高了的
Te11UA
2021-04-20 16:17:12 +08:00
的确是,所以公司的项目还是多线程,异步的话是一个两个人单兵 run 的
CantSee
2021-04-20 16:17:56 +08:00
异步非阻塞?
balabalaguguji
2021-04-20 16:18:45 +08:00
@Te11UA #14 嗯,如果不是必须异步,多线程挺适合
LeeReamond
2021-04-20 16:21:31 +08:00
@balabalaguguji 相比于多线程,人员素质要求高,并非引战,不过如果你是写 python 的人大概不知道自己在说什么。相比于使用 c/cpp/java 等语言的工程人员,使用多线程处理 IO 对人员素质的要求远比单线程异步高得多,线程安全需要解决有序性、可见性和原子性的问题,而单线程异步只需要理解 epoll 接口怎么调用,之后就是事件循环内部维护的事务了,如果你连这点要求都认为是高要求,我的建议仍然是不要写码。至于你说的调用产生死循环的问题,我司前一段刚做过微服务的栈深度清理,我确实是不理解你在一个线程内部还能搞出所谓调来调去?
Justin13
2021-04-20 16:22:20 +08:00
你说的阻塞逻辑也好,死循环也罢,都是不应该出现的问题代码,和你同步异步没有关系
Richard14
2021-04-20 16:24:59 +08:00
balabalaguguji
2021-04-20 16:30:17 +08:00
@LeeReamond #17 应该是你技术方面比较厉害,考虑面比较全,线程方便考虑那么多处理。日常我们都很少需要考虑线程安全,按照一个团队来考虑,人员技术不一样,个人觉得用多线程会比异步的技术要求低。

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

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

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

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

© 2021 V2EX