node.js与python作为后端服务的编程语言各有什么优劣?

前端,但是想学习一门后端的语言,本来是想学习node js,毕竟如果把node作为后端语言对我前端的js的熟悉程度也是有帮助的,但是发现node学习曲线有点陡,而且也没什么好的学习资料,而且国内node也不是很流行,发现python是门不错的后端语言,学习资料也多,现在我在纠结两者之间,求大神指教下?回复内容:
@sun ruoyu 针对说node不擅长crud这一点稍微说两句crud应用和平台本身没多大关系,更多是看上层的开源库。express + (mongo + mongoose) || (node-mysql + sequelize) 开发crud也快得很,更关键的是node本身异步的数据库i/o性能上比python真的高很多。有人说node缺少“成熟”的大框架,其实这和node社区的开发思想有关,几个领头的开发者都推崇“写做好一件事的小程序,然后把它们串起来”的unix哲学,加上npm对于包之间互相依赖处理得很好,所以灵活性其实是node的卖点之一。在我个人看来,node并不需要像rails/django这样“大而全”的web框架。
disclaimer: 以下对比可能有强烈的个人色彩node.js > python 的地方快:这个快有两方面,第一是v8引擎快,在v8引擎背后操刀的是lars bak大神,他创造过高性能smalltalk引擎和java hotspot引擎(现在java的默认vm),他带领下的v8引擎让javascript速度达到了一个新的阶段。第二是异步执行,node.js功能上是一个基于v8引擎的异步网络和io library,和python的twisted很像,不同的是node.js的event loop是很底层的深入在语言中的,可以想象成整个文件在执行的时候就在一个很大的event loop里。npm:npm可以说是用起来最顺手的package management了,npm作为node.js的官方package management,汇集了整个社区最集中的资源。不像python经历过easy_install和pip,还有2to3的问题。windows支持:node.js有微软的加持,windows基本被视为一等公民来支持,libuv已经可以很好的做到统一跨平台的api;而python虽然也对windows有官方的支持,但是总感觉是二等公民,时不时出些问题。python > node.js 的地方语言:就单纯从语言的角度来说,python写起来要比javascript舒服很多。javascript设计本身有许多缺陷,毕竟当时设计的时候只是作为在浏览器中做一些简单任务的script,所以代码一旦庞大,维护还是有困难(不过node.js的module很大的改善了这个问题)。不过用coffeescript可以很大的改善javascript,几乎可以和python等同。成熟:成熟包括语言本身已经成熟,还有framework和ecosystem也很庞大。node.js的绝大多数framework都很新,有的api一直在变,有的感觉已经不在维护,总之没有一个像django那种百足之虫感觉的framework。python的主流orm sqlalchemy也很成熟。python 和 node.js 很难分高下的地方异步style:node.js的异步style是cps,也就是层层callback,基于event,和浏览器中的javascript很像。cps好处是让熟悉浏览器javascript的人能很快上手,学习难度也不大。缺点是逻辑一复杂,就变得很难维护,基本上需要通过async.js这种library,或者用promise。python的异步除了和node.js很像的twisted之外,也有基于coroutine的gevent,coroutine让异步代码维护起来更容易,不过学习曲线陡。应用场景:如果是一个crud的app,那么想都不想直接是python,node.js本身不擅长crud的app(绝大多数node.js都是直接裸在外面的,而不是有一个nginx在前面,否则websocket就不能用了,不过新版nginx开始支持websocket),代码又不好维护,而python的wsgi很适合,成熟的stack也有很多。如果更偏向于real-time,比如一个chat room,那么node.js实现更容易。这两个应用场景还是有差别的。
个人接触过django和少量的node.js也在考虑经后的web开发主要使用哪一个?在我看来,django更全面,开发一个完整的网站或者cms。而node.js的特点也很突出,但是完全用node.js开发一个完整的网站是不划算的,我更倾向于用node.js开发restful的服务端,可以解决高频率的请求,同时也避免事件嵌套的深度。于是,有了这样的想法,django做web的开发,在一些需要restful或高频请求的部分用node.js各自发挥其长处…
前面sun rouyu的回答已经很全面了。补充一句,npm和commomjs的require已经超越了一个简单的包管理工具,已经发展成为一种系统架构形式。另外,我用coffeescript写node.js,可以享受两个世界的好处。python虽然也有异步库,但是由于异步不是它的dna,因此不同框架和库的实现是很不一致的。这点对node.js来说,其异步模式已经成为99%的modules首先要遵守的规范,这个一致性是一个健壮的后台程序所必须的。
python的gevent带来的非阻塞io和coroutine同步方式封装异步,足以完爆twisted;nodejs的特性也就是非阻塞io和更快语言解释器,但是基于事件编程模式更合适对用户响应方式的前端,不太合适大部分是rpc或循环方式的服务端逻辑;现在分布式和smp架构下 gevent多进程+coroutine+简洁的语言特性+容易c/c++性能扩展绝对是理想选择。
node.js 的框架express 难度应该与 python的框架 django,tornado,flask等等差不多。已经熟悉了js,不如还是从node.js入手。
性能的区别我不觉得很多人的系统会比paypal更复杂paypal现在全nodejs(后台bi可能还是java)不过prototype模式构建大型代码有难度改造成oo 编程难度和写python没区别callback不是问题 我没用那些改造callback的js库 纯js原生方式 习惯了就好
不妨再参考下这个:node.js 究竟是什么? node 是一个服务器端 javascript 解释器,它将改变服务器应该如何工作的概念。它的目标是帮助程序员构建高度可伸缩的应用程序,编写能够处理数万条同时连接到一个(只有一个)物理机的连接代码。为试图解释什么是 node.js,本文将简要介绍一些背景信息:它要解决的问题,它如何工作,如何运行一个简单应用程序,最后,node 在什么情况下是一个好的解决方案。本文不涉及如何编写一个复杂的 node 应用程序,也不是一份全面的 node 教程。阅读本文应该有助于您决定是否应该继续学习 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功能极大的方便了测试,编译等等,很大程度上提高了开发效率5. nodejs今天已经形成巨大的生态:npm上的库是最多的,与后端编程风格非常接近的angularjs,与watch结合的测试框架,webpack,livereload,pm2,所有这些东西对于web开发来说,都远远优于其他语言的开发6. javascript语言的演进也渐渐让javascript变得更加好用,例如回调逐渐演变为promise,async/await
必须是python 这里说python不太合理。如果要对位的话,nodejs对位应该是python的tornado框架。之前研究过百度的clouda,算是两个都接触过吧。我重点说说tornado好了,nodejs在tornado面前优势并不大。首先,性能 node在性能上相比tornado来说占优,但优势很小,可以说是language bonus,c++的加成。但是他们的设计思想基本类似,所以性能差距并不大,更何况如果业务处理速度慢了,吞吐量再大也是虚的。其次,易用性 这一点基于python的tornado完胜,你可以以同步的形式写出异步代码而不需要借助一大堆回调和闭包,这对于重业务的场景来说是非常注重的,这也是node学习成本陡峭成因,而且一旦使用不好,node一大堆闭包导致的内存爆栈风险想必会折腾每个学习node的人吧。扩展性 毫无疑问,除了lua,还没有别的语言可以说有python的扩展性便利了,对于计算密集型的业务或者功能可以轻而易举的使用c语言来自定义扩展(我甚至写过一个awk的嵌套编程)。更何况python自身还存在几何倍数于npm的扩展包(呵呵,反驳我的应该也知道,至少npm好多模块简直无法直视,你见过一个模块只有一个函数,里面就一句话的吗?高质量的库数量简直无法跟pypi比,开发门槛在那里呢,所以咬死我都不会承认npm包数量有python多,因为太多垃圾了)。并且你还可以直接对框架层面进行修改跟自定义(当然在许可证许可的条件下),重新定义引擎行为,eventloop行为,自由度高。可维护性无需赘言,js代码很难写出python的优雅跟风骚,而且各种callback跟闭包对可读性简直就是灾难。加上js语言本身也有很多坑。这一回合python完胜。总之,我个人是这么个情况,如果有人拿nodejs跟tornado来说事,我一定会告诉他我非python不用。哪怕要我辞职。

Posted in 未分类

发表评论