为什么 Node.js 这么火,而同样异步模式 Python 框架 Twisted 却十几年一直不温
作为使用Twisted基础开发物联网的工程师,说说自己的经历。1)一开始很喜欢Twisted,因为啥都有,不只是Web,包括IoT的MQTT,CoAP,RawTCP/UDP,TLS,都可以。2)异步->yield->生成器->装饰器->面向切面....搞清楚所有概念才会编程不出错。我觉得Twisted完全颠覆了我对于Python简单直接的理解。最要命的调试很复杂,而且没有中国社群,只有去Stackoverflow,时差,问书的作者没人理。3)用惯了,习惯了......4)发现CPython的性能瓶颈,必须要上pypy,但是pypy支持一些非纯粹Python代码有问题。5)发现gevent或许不错,同Flask+gvent也可以。6)继而发现Golang不错,或许可以用作IoT接入端。所以,现在是Twisted+Cyclone+MQTT+txThings+CustomTCPProtocol全套。性能不够的话,会把IoT前端以pypy+twisted加速,以及并最终推到golang前端。没有node.js什么事情。web端需要平衡Cylone+pypy,或者flask+gevent之间的表现。不过如果在PaaS平台,node.js得到的支持真的比异步Python要好!
Node.js能做成今天这样的局面,而Python里没有这样的子原因主要有如下:-同步IO对异步框架的性能相当致命,业务里没准就会出现一个同步IO操作。Node解决这个问题靠的是强制异步IO操作,使得Eventdriven模型能够高效执行。但是Python里用同步IO应该是很习以为常的事情,要求全异步估计很少人能做到。这就导致了tonado之类的框架无法流行。但Node里直接剥夺了你写同步IO的权利,并且Node没有啥历史包袱,推动异步IO比较容易。-另一个原因js里的闭包实现这个很自然
1,twisted在推广、文档、知名度上全面输给Node。twisted:至今只有一本书,还是英文的。再看Node.js:中文书就已经出了十几本了。2,twisted在总体设计思想上,有些滞后了。对于分布式编程的支持,没有node那么好。node的rpc和闭包,使得它对于分布式的支持,更加容易和简便。twisted,你都要自己一点点写啊……3,性能上,个人觉得twisted和node.js旗鼓相当,完全看怎么设计,怎么用。比如:IO上,其实大家都差不太多,不是说你用了什么语言,就能把网卡的发送效率、硬盘的读写这些IO操作提高多少的(因为最后走的都是操作系统的调度)。性能,差就差在语言的运行效率、对CPU的占用上。因为没做过Python和Js的运行效率测试,只能是估计一下,应该是也不会相差太多,毕竟它们都是动态语言。(但是跟C、C++和GO的执行效率,不是一个层次的,一个简单的赋值运算,用C来写,效率就是Python的300倍以上)。
其实和node比还不如先和Ruby社区比,Python的Web框架数量非常多,流行的就有好多种,轻的重的都有。而Ruby的话,大家都扑在RoR上,而且有37signal这个带头大哥,引领社区的发展。所以从这一点上来看,Python社区基本上处于一个百花齐放的状态,这也没什么不好。而JS和Ruby大家的力量都往一个点上使,但我认为也可能抑制了部分创新。比如Gevent/Greenlet就是不错的思路,但是Ruby的库还没有非常火。而JS要是想实现Coroutine基本很难。另外我觉得其他的因素也包括。没有V8,JS的运行效率根本就上不去,还记得最早MS的ASP么(不是.NET)?那时候是可以用JScript和VBScript去写服务端程序的(如果我没记错的话)。所以Google花了那么多精力搞了V8,然后被移花接木到服务端,贡献还是很大的.(话说Google有用node开发的应用么?)很重要的一点,做Web开发的同志,很少有不会用JS的,所以这是一个非常大的优势。模块化和组建话也是让Node成为好的框架的必要因素。CoffeeScript我觉得也可以算作一个加分项,让很多Python/Ruby的程序猿也愿意去用Node了。当然Coffee最主要的我认为还是约束了程序猿,让他们少踩雷。同时还简化了代码量。xMQ/Redis/MongoDB等最近几年发展起来的事物使得很多事情变得比以前简单,而Node也正好符合这一波潮流。比如JSON这种天生Key-Value的东西基本不用怎么变换就可以在xMQ/Redis/MongoDB间随意存储。而且其实相信很多人在特定领域也会用Node.js来做后端的前端,背后用MQ连接Python/Ruby来处理的,毕竟大家各有所长,而且Python的库的确非常丰富,Node在这点上还差点。
用过python与nodejs,确实认为python的语言设计,优雅程度都比javascript好,但是实际开发中nodejs确实比python好用nodejs几大优点:1.nodejs的环境搭建非常方便,npm包管理也足够好用,几个命令一运行就可以了,而python环境的安装却足够痛苦2.nodejs强制异步,io异步化,mysql异步,http请求异步,而且异步callback是javascript的天然用法,因此实际项目不用太多优化就能比python的同步mysql快很多3.nodejs与前端统一,实际开发中不需要像python那样进行环境切换,语言切换4.nodejs的文件系统watch功能极大的方便了测试,编译等等,各种支持watch的工具很大程度上提高了开发效率5.nodejs今天已经形成巨大的生态:npm上的库是最多的,与后端编程风格非常接近的angularjs,与watch结合的测试框架,webpack,livereload,pm2,所有这些东西对于web开发来说,都远远优于其他语言的开发6.javascript语言的演进也渐渐让javascript变得更加好用,例如回调逐渐演变为Promise,async/await
nodejs有两个可以大书特书的优点:1、和前端统一语言,减少【想象中】的学习成本。2、npm好用到不行,虽然很多lib难用到不行。你猜猜看,看上去很简单实际上很困难,看上去很困难实际上比较简单,这两个谁的用户会比较多?
回答请先登录