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

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

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

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

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

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

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

15786 次点击
所在节点    编程
153 条回复
balabalaguguji
2021-04-20 18:28:54 +08:00
@rahuahua #59 竟然是这样,突然对 go 很有好感
rahuahua
2021-04-20 18:29:08 +08:00
@balabalaguguji Go 就是多线程加 I/O 非阻塞执行,强大的并发调度 Runtime,语法简单,看不出异步的痕迹,全在 Runtime 里面。
superrichman
2021-04-20 18:32:14 +08:00
就是一句话 “一处异步,处处异步”
zhuichen
2021-04-20 18:32:20 +08:00
所以异步的优点有哪些?
balabalaguguji
2021-04-20 18:32:23 +08:00
@crclz #60 感谢指点,C#没想到走在异步的最前列,没用过这个语言。嗯,我讲的是基于 python 和 nodejs 的了解。
balabalaguguji
2021-04-20 18:33:20 +08:00
@zhuichen #64 网上都出都在说优点,随便一早就一堆,不过我说的这个缺点,没几个人说。
balabalaguguji
2021-04-20 18:34:15 +08:00
@superrichman #63 是的。某天想把我的 python 代码改为异步的,发现好多东西要换,太麻烦放弃了。
balabalaguguji
2021-04-20 18:35:28 +08:00
@rahuahua #62 感觉很不错,完美结合两个东西
momocraft
2021-04-20 18:35:32 +08:00
py 这样后天改出 async io 的, 是不是不匹配的现有代码会多一些

另外事件循环能写出死锁的人 换了多线程未必写不出
balabalaguguji
2021-04-20 18:36:58 +08:00
@momocraft #69 常见的就是递归调用容易死循环。多线程写出来没关系,不会卡住整个网站,这才是重点。
lewinlan
2021-04-20 18:41:14 +08:00
看标题就猜到又是一个被 python 毒害不浅的
balabalaguguji
2021-04-20 18:42:13 +08:00
@lewinlan #71 是的,某天转异步时发现很蛋疼,后面学习了下 nodejs,发现好多了。
carity
2021-04-20 18:47:55 +08:00
"异步因为是只有一个线程,如果有一个地方阻塞了,那整个网站全部都卡住了"
看到这就懵逼了,nodejs 我不熟悉,然后看到 python 我懂了 :doge
SenLief
2021-04-20 18:53:10 +08:00
python 又不是一个新的语言,没什么历史包袱,不能站在结果的角度去看过程。选择了这个技术栈也同样选择了它的优缺点。当然如果有能力建议帮她改进下,让更多人更好用。
zwy100e72
2021-04-20 19:18:48 +08:00
感谢楼主、参与的人没有把技术问题升级到互相攻击的地步,这样的讨论氛围实在太难得了。
luoqeng
2021-04-20 19:20:28 +08:00
建议学学 golang,语言级别的协程支持,和你平时写同步代码没什么差别。
jones2000
2021-04-20 19:22:39 +08:00
异步不好用, 很多逻辑都被打断了,下个数据就异步, 同步的逻辑多好处理,简单。
jeffwcx
2021-04-20 19:42:55 +08:00
@rahuahua 得了吧,那位佬早就退出了,可以说早期 callback hell,他有很大的责任
xiubin
2021-04-20 19:43:48 +08:00
『异步因为是只有一个线程,如果有一个地方阻塞了,那整个网站全部都卡住了』

不用异步就不会卡住吗?没 get 到楼主的意思是什么。还有异步和死循环有什么关系呢
jeffwcx
2021-04-20 19:45:58 +08:00
node 底层的 epoll 还是多线程啊,可以说 node 的异步是封装地很好的多线程

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

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

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

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

© 2021 V2EX