为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温不火?

时间:2021-03-01 03:16:47

twisted是一个强大的异步网络框架,应用的面也非常广,但是没有这几年才出现的Node.js火,社区、文档也是很少可怜
我觉得二者其实在本质上差不多,而且python使用起来还是比较容易一些的

匿名用户

因为,它给了一大部分程序猿幻觉比如前后端统一,脚本也能性能很屌,做Demo搜搜快什么的,但实际上,这仅仅是幻觉罢了……

正是因为这样的幻觉是“看得到”的,又有一个响当当的干爹Google,因此Node的曝光率远高于后端常规语言就不足为奇了。

论速度,你一个带JIT的跟常规脚本语言的虚拟机比,没到数量级差异丢不丢脸?内存各种匪夷所思的占用丢不丢脸?web才和CPython+Gevent一个水平比不过pypy丢不丢脸?
论稳定性,Python十来年的积累,大公司的经验,你一个以桌面系统为目标的V8拿来做工程逗我玩呢?
论代码的管理,Js那种匪夷所思的陷阱还要不要一起玩了?Callback hell?

说白了,前端工程师在普通level这级人数太多了,作出来的东西能看得到,吸引力比埋头在服务器上耕耘的系统工程师要高。技术新人往往是被看得见的先吸引到,但不深入怎么知道系统的严谨?node一出前者觉得自己各种碉堡,觉得System Engineer is die 然后四处宣传,比如你看老子一天撸出个实时web,还带个碉堡的前端实现,看看你们系统工程师,呵呵呵。Full Stack哦,一个socket连接消耗多少内存都算不出来你跟我谈Full Stack?

所以,这就不是浮躁的宣传这是什么?系统工程是很严谨的,打交道的往往不仅仅是代码,最终产出最看重的也不是什么性能,很多设计很多实现最终服务的都是后端系统的稳定性,扩展性等这些跟钱相关的东西,你跑来跟我谈跑循环?循环能赚个锤子?

至于Python的XXX为何不火,Callback早就有Twisted,新生代也有Tornado,Coroutine有Gevent,Actor有Pulsar,VM方面要稳妥CPython,要性能PYPY,要并发Stackless,AIO神马的的选择太多了,你喜欢上啥就有啥,社区要运作要宣传怎么闹,手头的牌太多了有木有。Node没这样的历史包袱,就一个选择,自然全部社区的力量和宣传都可以集中到这上面去,加之低门槛,你看出书都出了多少,不火才不科学。

但是,做工程和火不火有毛关系啊?

bhuztez长期求职

关键是营销做得好。说是因为Twisted有什么不如Node.js的技术缺陷,那都是不客观的。

比如

Node解决这个问题靠的是强制异步IO操作,使得Event driven模型能够高效执行
这个就太想当然了。连node.js的作者都不会这么说。你一定不知道什么叫POSIX吧。按POSIX的定义,一个file descriptor假如对应的是普通文件,不管有任何non-blocking或者async的选项可以设置,它必须block。Node.js也只是在背后开了一个线程池。这种做法和Twisted并没有任何区别,而且比Twisted更糟糕。Twisted实现了线程池的功能,并且暴露API给你用,这样你碰到别的没法异步的地方,你也可以用Twisted的线程池。而Node.js在很长时间内并不打算提供线程池,或者说,Node.js有线程池只是你不会C++罢了。

另外,没有抢占式调度,你还是不可避免地要审查代码。有些代码相比别的代码消耗了太多CPU了,成为了瓶颈。查这个比查有没有调用会block的代码可难多了。Python再没节操,好歹库里也把语言自身的ast暴露出来了,很容易就能写个脚本检查出来了,现成Python代码检查工具不会比JavaScript难用的,JavaScript语言设计就拖后腿了。

原因之一也许是 JS 能方便地在表达式里插函数,你 python 的 lambda 里能放语句么?

只有要把同步写法扭曲成异步写的时候,lambda写起来是否方便才会显得很重要。Twisted有inlineCallbacks,不需要扭曲。

python这种语言要做nodejs的异步的事情,得语言支持cps变换才行

原因是V8那时还远没有yield。就Node.js用没有yield的V8而不用早就有yield的SpiderMonkey这点就可以不用看了。这个选择完全就是为了营销。Python有yield,没必要自己搞什么CPS变换。

tornado

是Tornado让Twisted变得更好了。之前Twisted在Web方面没有花太大精力,导致Twisted.web也就仅仅是能用,远说不上是好用。但是Tornado除了Web部分做的比较好,其他地方都是不如 Twisted的。只要把Tornado的Web部分移植到Twisted上,Twisted的Web也不烂了嘛。就有一个叫cyclone的项目做了这个。我不会告诉你跑分还比原生Tornado要好呢。

-----------------------------------------------------

在Node.js还没起来的时候,Twisted那几个开发者早就知道只能异步很不好,等知道有Erlang这种语言的时候,都开始大力向推荐大家用Erlang了。Node.js刚出来那时候和Erlang比,不,显然就不该做这样的比较。

营销做得好,才是Node.js火起来的关键。

假如你还记得那个多少行写个IRC的slides。大致是这样的,Node.js的作者在拿Event-driven和Apache那种fork子进程方式对比的时候,他是有理有据地指出了Event-driven的优点。但是在讲和其他模式对比的时候,他讲的是感觉。他说要是把那些不能立即返回的操作的调用方式和一般的函数调用区别开,不然会给人以错觉 。这样一来,只能写异步回调就立即变成优点了。把Node.js最致命的缺点都包装成优点了,再没节操地鼓动一帮人去搞一些毫无意义的benchmark,立即就避免了不利的局面。喊口号总是最容易的,事件驱动就是高性能, 库就是包袱,异步回调地狱就是好就是好就是好。就火起来了。

就是这样

刘缙系统编程

在Python增加带返回值的yield前,Twisted代码全是回调,程序结构那是相当的twisted。在Python这个注重代码简明的语言里,Twisted实在是格格不入。大部分Python程序员恐怕没看完deferred就被吓跑了。

而回调对js程序员根本不是个事儿。

匿名用户

首先对于排名第一大谈 nodejs 弱爆了,System Engine 才是吊的人做个冷嘲——真正做 nodejs 的如果不熟悉 v8 引擎和 libuv 其实只能是做作外围吧?而熟悉 v8 和 libuv 的哪一个没有扎实的 System Engine 基础(没个七八年的 C/C++ 项目基础能玩转 v8 和 libuv 的那真是少见了)?然后说出什么搞 nodejs 的人搞不清楚 websocket 消耗多少内存这种话你确定打击面没有太大?难道你身边有一些初级的 nodejs 开发人员给你造成了错觉然后你就优越到没边了?

在这种角度就讨论技术,讨论的根本不是技术,而是自己的偏好,自己的圈子和好恶。调侃下可以,但是真的是一点营养都没有。而那些赞同他的人,我只想问你们真的有研究过 nodejs?

分割线下面是之前的回答。

-----------------------------------------------

 

说 nodejs 只是靠营销的是否太天真了些?当初 nodejs 出来的时候各种 BUG,我简单的测试其大文件传输都会出现各种问题。而同時期的其他阵营早就甩其几条街了。但是为什么却能一直不断发展壮大?难道仅仅靠所谓的营销和忽悠?

如果只孤立的去考虑 nodejs 的异步库到底怎样怎样,实在是太片面了,难道 nodejs 里面就只提供了异步网络 IO?

事实上,nodejs 是提供了一套通用的异步基础设施,使得你可以基于此构建各种异步 API。异步网络 IO 只是其上的一个具体应用。而现在问题里提及的 twisted 实际上在这一点上根本不具有与 nodejs 的可比性!

我选择 nodejs 的原因很大程度上是因为它是 JavaScript 的,这样一来在前后端我可以用同一种语言完成整个项目,这是极大的一个优势!另外,尽管 nodejs 不是唯一的也不是最早的基于 JavaScript 的服务端方案。但是它是同時期性能 JavaScript 阵营里最佳的。

再加上 nodejs 底层的 libuv 设计很简单,非常容易扩展,而且 npm 又那么好用。因此开发效率急速上升。

选择 nodejs 到底为什么,其实到了现在,许多人各自有各自的理由。但许多人都是因为他是基于 JavaScript 的低成本解决方案。