问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-04-23 18:13

我来回答

1个回答

热心网友 时间:2022-04-27 04:09

一. NodeJS的特点

我们先来看看NodeJS官网上的介绍:

Node.js is a platform built on Chrome’s JavaScript runtime for easily building fast, scalable network applications. node.js uses an event-driven, non-blocking I/O model that makes it lightweight and efficient, perfect for data-intensive real-time applications that run across distributed devices.

其特点为:
1. 它是一个Javascript运行环境

2. 依赖于Chrome V8引擎进行代码解释

3. 事件驱动

4. 非阻塞I/O

5. 轻量、可伸缩,适于实时数据交互应用

6. 单进程,单线程

二. NodeJS带来的对系统瓶颈的解决方案

它的出现确实能为我们解决现实当中系统瓶颈提供了新的思路和方案,下面我们看看它能解决什么问题。

1. 并发连接

举个例子,想象一个场景,我们在银行排队办理业务,我们看看下面两个模型。

(1)系统线程模型:

这种模型的问题显而易见,服务端只有一个线程,并发请求(用户)到达只能处理一个,其余的要先等待,这就是阻塞,正在享受服务的请求阻塞后面的请求了。

(2)多线程、线程池模型:

这个模型已经比上一个有所进步,它调节服务端线程的数量来提高对并发请求的接收和响应,但并发量高的时候,请求仍然需要等待,它有个更严重的问题。到代码层面上来讲,我们看看客户端请求与服务端通讯的过程:

服务端与客户端每建立一个连接,都要为这个连接分配一套配套的资源,主要体现为系统内存资源,以PHP为例,维护一个连接可能需要20M的内存。这就是为什么一般并发量一大,就需要多开服务器。

那么NodeJS是怎么解决这个问题的呢?我们来看另外一个模型,想象一下我们在快餐店点餐吃饭的场景。

(3)异步、事件驱动模型

我们同样是要发起请求,等待服务器端响应;但是与银行例子不同的是,这次我们点完餐后拿到了一个号码,拿到号码,我们往往会在位置上等待,而在我们后面的请求会继续得到处理,同样是拿了一个号码然后到一旁等待,接待员能一直进行处理。

等到饭菜做号了,会喊号码,我们拿到了自己的饭菜,进行后续的处理(吃饭)。这个喊号码的动作在NodeJS中叫做回调(Callback),能在事件(烧菜,I/O)处理完成后继续执行后面的逻辑(吃饭),这体现了NodeJS的显著特点,异步机制、事件驱动整个过程没有阻塞新用户的连接(点餐),也不需要维护已经点餐的用户与厨师的连接。

基于这样的机制,理论上陆续有用户请求连接,NodeJS都可以进行响应,因此NodeJS能支持比Java、PHP程序更高的并发量虽然维护事件队列也需要成本,再由于NodeJS是单线程,事件队列越长,得到响应的时间就越长,并发量上去还是会力不从心。

总结一下NodeJS是怎么解决并发连接这个问题的:更改连接到服务器的方式,每个连接发射(emit)一个在NodeJS引擎进程中运行的事件(Event),放进事件队列当中,而不是为每个连接生成一个新的OS线程(并为其分配一些配套内存)。

2. I/O阻塞

NodeJS解决的另外一个问题是I/O阻塞,看看这样的业务场景:需要从多个数据源拉取数据,然后进行处理。

(1)串行获取数据,这是我们一般的解决方案,以PHP为例

假如获取profile和timeline操作各需要1S,那么串行获取就需要2S。

(2)NodeJS非阻塞I/O,发射/监听事件来控制执行过程

NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,两个动作并行执行,假如各需要1S,那么总的时间也就是1S。它们的I/O操作执行完成后,发射一个事件,profile和timeline,事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞I/O的特点。

总结一下:Java、PHP也有办法实现并行请求(子线程),但NodeJS通过回调函数(Callback)和异步机制会做得很自然。

三. NodeJS的优缺点

优点:1. 高并发(最重要的优点)

2. 适合I/O密集型应用

缺点:1. 不适合CPU密集型应用;CPU密集型应用给Node带来的挑战主要是:由于JavaScript单线程的原因,如果有长时间运行的计算(比如大循环),将会导致CPU时间片不能释放,使得后续I/O无法发起;

解决方案:分解大型运算任务为多个小任务,使得运算能够适时释放,不阻塞I/O调用的发起;

2. 只支持单核CPU,不能充分利用CPU

3. 可靠性低,一旦代码某个环节崩溃,整个系统都崩溃

原因:单进程,单线程

解决方案:(1)Nnigx反向代理,负载均衡,开多个进程,绑定多个端口;

(2)开多个进程监听同一个端口,使用cluster模块;

4. 开源组件库质量参差不齐,更新快,向下不兼容

5. Debug不方便,错误没有stack trace

四. 适合NodeJS的场景

1. RESTful API

这是NodeJS最理想的应用场景,可以处理数万条连接,本身没有太多的逻辑,只需要请求API,组织数据进行返回即可。它本质上只是从某个数据库中查找一些值并将它们组成一个响应。由于响应是少量文本,入站请求也是少量的文本,因此流量不高,一台机器甚至也可以处理最繁忙的公司的API需求。

2. 统一Web应用的UI层

目前MVC的架构,在某种意义上来说,Web开发有两个UI层,一个是在浏览器里面我们最终看到的,另一个在server端,负责生成和拼接页面。

不讨论这种架构是好是坏,但是有另外一种实践,面向服务的架构,更好的做前后端的依赖分离。如果所有的关键业务逻辑都封装成REST调用,就意味着在上层只需要考虑如何用这些REST接口构建具体的应用。那些后端程序员们根本不操心具体数据是如何从一个页面传递到另一个页面的,他们也不用管用户数据更新是通过Ajax异步获取的还是通过刷新页面。

3. 大量Ajax请求的应用

例如个性化应用,每个用户看到的页面都不一样,缓存失效,需要在页面加载的时候发起Ajax请求,NodeJS能响应大量的并发请求。  总而言之,NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。

Python的优缺点

优点

简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。

易学————就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。

免费、开源————Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。

高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!

解释性————这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

面向对象————Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。

可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

丰富的库————Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

概括————Python确实是一种十分精彩又强大的语言。它合理地结合了高性能与使得编写程序简单有趣的特色。

规范的代码————Python采用强制缩进的方式使得代码具有极佳的可读性。

缺点

强制缩进

这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,而这是用肉眼无法分别的。

单行语句和命令行输出问题

很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此*,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。(对很多用户而言这也不算是*)

NO.1 运行速度,有速度要求的话,用C++改写关键部分吧。

NO.2 国内市场较小(国内以python来做主要开发的,目前只有一些 web2.0公司)。但时间推移,目前很多国内软件公司,尤其是游戏公司,也开始规模使用他。

No.3 中文资料匮乏(好的python中文资料屈指可数)。托社区的福,有几本优秀的教材已经被翻译了,但入门级教材多,高级内容还是只能看英语版。

NO.4 构架选择太多(没有像C#这样的官方.net构架,也没有像ruby由于历史较短,构架开发的相对集中。Ruby on Rails 构架开发中小型web程序天下无敌)。不过这也从另一个侧面说明,python比较优秀,吸引的人才多,项目也多。

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

node.js 优势:运行速度更快,部署更方便,装上之后,服务器就是一个web server, 劣势:没有很多成熟的框架,著名的运用,只流行于国外。 python 优势:python/django 做网站效率高 python/openstack可以云开发。写出的代码容容易维护,更短 劣势:暂时没发现,可能有同学说运行速度慢 ...

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

Python优于Node.js的地方:语 言:就单纯从语言的角度来说,Python写起来要比Javascript舒服很多;Javascript 设计本身有许多缺陷,毕竟当时设计的时候只是作为在浏览器中做一些简单任务的script,所以代码一旦庞大,维护还是有困难(不过Node.js的 module很大的改善了这个问题),不过用Coffeescript可以很大的改...

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

NodeJS遇到I/O事件会创建一个线程去执行,然后主线程会继续往下执行的,因此,拿profile的动作触发一个I/O事件,马上就会执行拿timeline的动作,两个动作并行执行,假如各需要1S,那么总的时间也就是1S。它们的I/O操作执行完成后,发射一个事件,profile和timeline,事件代理接收后继续往下执行后面的逻辑,这就是NodeJS非阻塞...

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

Node.js 与 Python 作为后端服务的编程语言各有什么优劣 看过Node.js Web和Node下ExpressWeb框架的开发代码,觉得其好处是和前端同一个语言,相对也属于比较轻的,于是框架技术设施提供的特性有限。而PythonWeb系相对选择就很多,目前流行的Flask和Django,Flask相对比较轻,Django属于All In One,Web开发的...

nodejs 还是python?

2.Node.js比较Python有以下利益。快,nodejs比python快在了V8引擎和异步实行。Node.js根据V8引擎和异步网络和IOLibrary,和Python的Twisted很像,不同的是Node.js的eventloop是在很底层的,我们都知道越接近 底层功率越高。其他npm作为Node.js的官方packagemanagement,汇集了整个社区最会集的资源;而Python...

Python,Node.js 哪个比较适合写爬虫

Node.js是一种基于JavaScript的后端开发语言,具有高效的I/O操作和事件驱动的特性,适合处理高并发的网络请求。Node.js的异步编程模型可以提高爬虫的效率,适合处理大规模的数据采集任务。综上所述,如果你对Python比较熟悉,且需要进行数据处理和分析,可以选择Python编写爬虫;如果你对JavaScript比较熟悉,且...

Python,Node.js 哪个比较适合写爬虫

1、NodeJS:对一些垂直网站爬取倒可以,但由于分布式爬取、消息通讯等支持较弱,根据自己情况判断。2、Python:强烈建议,对以上问题都有较好支持。尤其是Scrapy框架值得作为第一选择。优点诸多:支持xpath;基于twisted,性能不错;有较好的调试工具;此种情况下,如果还需要做js动态内容的解析,casperjs就...

想自学后端,Nodejs 和 Python 哪个更值得一荐

本人死会js 和python 的 Python 更加简单易学 个人推荐 代码的易读性更强 对于初学者 更加容易上手 nodejs 的话 语法比较不严谨 很多时候 代码很凌乱 我自己写的代码 有时候 都看着发蒙

web自动化测试,使用node.js 与python哪个语言更合适

不过就我个人而言python很熟练,python给我的自由度与支撑力度远远大于node.js。 node.js是一些喜欢javascript的极客做的js的后台执行程序。 支持力度显然远远比不上有10几年WEB开发历史的python。node.js有一个最大的好处是前端与后端的融合比较好。都是JS开发的。有利于前端人员快速开发后台服务器。再加...

js和python那个比较难?

js做前端,延伸node.js做后端操作mongodb数据库非常方便,轻量级全栈开发可以考虑这个路线,python主要做后端,可以和多款关系型数据库结合比较好常见mysql比较多,全栈的话学习成本高于javascript。两门都可以做web开发,爬虫,桌面应用等。python比js多了一些应用场景,比如人工智能,大数据等。python在前端分离...

js是脚本语言还是编程语言 编程语言与脚本语言 编程语言属于脚本语言的是 node.js是前端还是后端 js才是最重要的编程语言 编程语言不属于脚本语言 html和编程语言的区别 脚本语言和编程语言统称 javascript算编程语言吗
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长沙悦涛文化干什么的 吉林省弘扬文化传媒公司怎么样?公司待遇怎么样? 脂肪肝跟肝内胆管结石.哪个会影响.入职体检 你好,我想请问一下广汽本田入职体检,查出肝内胆管结石会不会拒绝... 肝内胆管结石,肝功能正常,会影响公务员入职体检吗 vb交换数组 ...从键盘输入的10个整数,存入一维数组,将前后元素依次对调后打印输出... 找一部9几年的国外影片 华丽的外出电影别名叫什么 《法国啄木鸟》系列电影的别名是什么? php与nodejs通信问题 nodejs rpc是不是 观察者模式 微信支付记录删除 苹果手机的id地址和密码在哪里? Apple ID用户名和密码是什么?在哪里看得到 苹果手机的ID密码在哪看 我要下东西,要用密码 我找不到啊? 苹果的id密码在哪里设置和找回 什么是《进京证》通行证 网上办进京证几个小时生效 申请进京证 苹果id从哪里查找密码 苹果id密码在哪看? 进京证第二天才生效怎么办 第二次怎样办理电子进京证 北京进京证第二次怎么预约不了 进京证的限制范围 进京证是什么 进京证期间可以二次进京吗 win10系统子网前缀长度是什么 不要跟我说什么二进制什么24位 这个只能填3位 win10电脑手动设置ip地址,以太网连接受限,自动设置ip地址,又连不上以 最近吃的食物过咸,喉咙一直发干,大量的饮水之后,效果并不明显,怎样才可以缓解一下,很难受 nodejs中怎么使用hessian 吃咸了嗓子不舒服怎么办 异地服务器之间,nodejs服务端,用什么方式通信比较稳定靠谱 为什么每次吃过咸的食物后总是喉咙疼,喉咙只要一疼就感冒,这是怎么回事? 如何在NodeJS中玩转Protocol Buffer 为什么吃咸一点的东西喉咙会不舒服 为什么吃咸了嗓子会疼? nodejs内存泄露有什么危害 吃咸的食物齁到了有什么偏方,嗓子不舒服 为什么我又从 Node.js 回到 Python 吃的太咸喉咙痛怎么办 吃咸了导致嗓子不适并且有痰 一吃咸的辣的嗓子就疼怎么回事 菜吃咸了,嗓子痛,怎么办? 吃咸了嗓子疼怎么办 咸的吃多了,嗓子痒,干咳怎么回事 食物过咸是不是容易导致上火,引起嗓子不适? 嘴巴吃了太咸的东西,喉咙痛怎么办 坐月子吃咸了嗓子不舒服怎么办