Node.js 与 Python 作为后端服务的编程语言各有什么优劣?
程序员文章站
2022-05-02 22:03:53
...
前端,但是想学习一门后端的语言,本来是想学习Node js,毕竟如果把Node作为后端语言对我前端的js的熟悉程度也是有帮助的,但是发现Node学习曲线有点陡,而且也没什么好的学习资料,而且国内Node也不是很流行,发现Python是门不错的后端语言,学习资料也多,现在我在纠结两者之间,求大神指教下?
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 的地方
也在考虑经后的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不用。哪怕要我辞职。
回复内容:
@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写起来要比Javascript舒服很多。Javascript设计本身有许多缺陷,毕竟当时设计的时候只是作为在浏览器中做一些简单任务的script,所以代码一旦庞大,维护还是有困难(不过Node.js的module很大的改善了这个问题)。不过用Coffeescript可以很大的改善Javascript,几乎可以和Python等同。
- 成熟:成熟包括语言本身已经成熟,还有Framework和ecosystem也很庞大。Node.js的绝大多数framework都很新,有的API一直在变,有的感觉已经不在维护,总之没有一个像Django那种百足之虫感觉的framework。Python的主流ORM SQLalchemy也很成熟。
- 异步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实现更容易。这两个应用场景还是有差别的。
也在考虑经后的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不用。哪怕要我辞职。
上一篇: 你真的会用Java中的三目运算符吗?