当前位置: 首页 > 编程日记 > 正文

node.js是做什么的?

作者:厂长
链接:https://www.zhihu.com/question/33578075/answer/56951771
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

国外有一篇非常好的Node.js 介绍文章,从原理入手讲解,在这里给大家翻译一下(本人非翻译出身,一些地方结合了点个人理解,有错误欢迎指出)。

原文地址 Node.js is the New Black


译文如下:
如果你去年注意过技术方面的新闻,我敢说你至少看到node.js不下一两次。那么问题来了“node.js是什么?”。有些人没准会告诉你“这是一种通过JavaScript语言开发web服务端的东西”。如果这种晦涩解释还没把你搞晕,你没准会接着问:“为什么我们要用node.js?”,别人一般会告诉你:node.js有非阻塞,事件驱动I/O等特性,从而让高并发(high concurrency)在的轮询(Polling)和comet构建的应用中成为可能。

当你看完这些解释觉得跟看天书一样的时候,你估计也懒得继续问了。不过没事。我这篇文章就是在避开高端术语的同时,帮助你你理解node.js的。


浏览器给网站发请求的过程一直没怎么变过。当浏览器给网站发了请求。服务器收到了请求,然后开始搜寻被请求的资源。如果有需要,服务器还会查询一下数据库,最后把响应结果传回浏览器。不过,在传统的web服务器中(比如Apache),每一个请求都会让服务器创建一个新的进程来处理这个请求。


后来有了Ajax。有了Ajax,我们就不用每次都请求一个完整的新页面了,取而代之的是,每次只请求需要的部分页面信息就可以了。这显然是一个进步。但是比如你要建一个FriendFeed这样的社交网站(类似人人网那样的刷朋友新鲜事的网站),你的好友会随时的推送新的状态,然后你的新鲜事会实时自动刷新。要达成这个需求,我们需要让用户一直与服务器保持一个有效连接。目前最简单的实现方法,就是让用户和服务器之间保持长轮询(long polling)。


HTTP请求不是持续的连接,你请求一次,服务器响应一次,然后就完了。长轮训是一种利用HTTP模拟持续连接的技巧。具体来说,只要页面载入了,不管你需不需要服务器给你响应信息,你都会给服务器发一个Ajax请求。这个请求不同于一般的Ajax请求,服务器不会直接给你返回信息,而是它要等着,直到服务器觉得该给你发信息了,它才会响应。比如,你的好友发了一条新鲜事,服务器就会把这个新鲜事当做响应发给你的浏览器,然后你的浏览器就刷新页面了。浏览器收到响应刷新完之后,再发送一条新的请求给服务器,这个请求依然不会立即被响应。于是就开始重复以上步骤。利用这个方法,可以让浏览器始终保持等待响应的状态。虽然以上过程依然只有非持续的Http参与,但是我们模拟出了一个看似持续的连接状态


我们再看传统的服务器(比如Apache)。每次一个新用户连到你的网站上,你的服务器就得开一个连接。每个连接都需要占一个进程,这些进程大部分时间都是闲着的(比如等着你好友发新鲜事,等好友发完才给用户响应信息。或者等着数据库返回查询结果什么的)。虽然这些进程闲着,但是照样占用内存。这意味着,如果用户连接数的增长到一定规模,你服务器没准就要耗光内存直接瘫了。


这种情况怎么解决?解决方法就是刚才上边说的:非阻塞事件驱动。这些概念在我们谈的这个情景里面其实没那么难理解。你把非阻塞的服务器想象成一个loop循环,这个loop会一直跑下去。一个新请求来了,这个loop就接了这个请求,把这个请求传给其他的进程(比如传给一个搞数据库查询的进程),然后响应一个回调(callback)。完事了这loop就接着跑,接其他的请求。这样下来。服务器就不会像之前那样傻等着数据库返回结果了。


如果数据库把结果返回来了,loop就把结果传回用户的浏览器,接着继续跑。在这种方式下,你的服务器的进程就不会闲着等着。从而在理论上说,同一时刻的数据库查询数量,以及用户的请求数量就没有限制了。服务器只在用户那边有事件发生的时候才响应,这就是事件驱动。


FriendFeed是用基于Python的非阻塞框架Tornado (知乎也用了这个框架) 来实现上面说的新鲜事功能的。不过,Node.js就比前者更妙了。Node.js的应用是通过javascript开发的,然后直接在Google的变态V8引擎上跑。用了Node.js,你就不用担心用户端的请求会在服务器里跑了一段能够造成阻塞的代码了。因为javascript本身就是事件驱动的脚本语言。你回想一下,在给前端写javascript的时候,更多时候你都是在搞事件处理和回调函数。javascript本身就是给事件处理量身定制的语言。


Node.js还是处于初期阶段。如果你想开发一个基于Node.js的应用,你应该会需要写一些很底层代码。但是下一代浏览器很快就要采用WebSocket技术了,从而长轮询也会消失。在Web开发里,Node.js这种类型的技术只会变得越来越重要。


以上。

转载于:https://www.cnblogs.com/FunkyEric/p/9186782.html

相关文章:

K8S - Kubernetes简介

Kubernetes Kubernetes(简称K8s,用8代替8个字符“ubernete”)是Google开源的一个容器编排引擎,支持自动化部署、大规模可伸缩、应用容器化管理。 Kubernetes 是目前最为广泛且流行的容器编排调度系统,也是现在用来构建…

python中filenotfounderror_Python3 报错 FileNotFoundError: [WinError 2]

Python3 报错 FileNotFoundError: [WinError 2]工具/原料 Python3.7 chromedriver 方法/步骤 1 首先,打开py文件,如图,有如下代码。 import time from selenium import webdriver driver webdriver.Chrome()2 然后运行py文件,run…

Push Notifications

push notification 使用: 参考资源: http://tiny4cocoa.com/thread-1406-1-1.html http://bbs.ldci.com.cn/read.php?tid-19971.html http://www.cocoachina.com/bbs/read.php?tid-3770-keyword-apns.html http://code.google.com/p/apns-python-wrapper/ http://…

[原创]Bash中的$*和$@的区别

2019独角兽企业重金招聘Python工程师标准>>> 在Bash脚本中,$*和$都用于表示执行脚本时所传入的参数。先通过一个例子看看他们的区别: #!/bin/bash # testvar.sh echo "-------------ISF is set to \"-seperator\" ------------" IFS…

文本处理工具之grep和egrep

文本处理工具之grep和egrep grep全称global search regular expression (RE) and print out the line正则表达式(一类字符所书写的模式pattern) 元字符:不表示字符本身的意义,用于额外功能性的描述基本正则表达式的元字符 字符匹配…

【转】堆栈和托管堆 c#

原文地址:http://blog.csdn.net/baoxuetianxia/archive/2008/11/04/3218913.aspx首先堆栈和堆(托管堆)都在进程的虚拟内存中。(在32位处理器上每个进程的虚拟内存为4GB) 堆栈stack 堆栈中存储值类型。 堆栈实际上是向…

python特性和属性_Python之属性、特性和修饰符

原博文 2018-03-17 11:08 − 作为面对对象的核心内容,将从以下一个方面进行总结: 1. property和property 2. __getattribute__()、__getattr__()、__setattr__()、__delattr__() 3. 描述符__get__()、__set__()、__delete__()... 相关推荐 2019-09-28 21…

pytest+allure环境别人电脑运行正常,自己运行不正常几种情况

1. AttributeError:module’ object has no attribute severity_level 之前运行都是正常的,想弄allure报告,就使用pip install allure-pytest 命令安装了,其实该命令的作用是会把你当前版本的pytest卸载掉,然后安装 al…

进驻宝岛 不闪式3D热潮来临?

本来说一直要换眼镜的,现在趁年底有空,专门去逛眼镜店。在逛宝岛的时候,发现了专门设立的不闪式3D体验区,供消费者体验。笔者在宝岛眼镜体验了下3D眼镜,觉得非常不错,特别分享下。自从LG Display开始全面进…

BZOJ3782 上学路线 【dp + Lucas + CRT】

题目链接 BZOJ3782 题解 我们把终点也加入障碍点中,将点排序,令\(f[i]\)表示从\((0,0)\)出发,不经过其它障碍,直接到达\((x_i,y_i)\)的方案数 首先我们有个大致的方案数\({x_i y_i \choose x_i}\) 但是中途可能会经过一些其它障碍…

007本周总结报告

这周感觉自己什么也没做,好没有成就感。这周大部分的时间都用来学车了,自己也是东跑西跑的,然而车也没有学好,java也学习的少的可伶。自己总是感觉自己学车都要忙死了。哪有什么时间学习java啊,能学好车就不错了。其实…

python max函数_Python3

max(x, y[, z...]):Number|Sequence 入参类型不能混入(要么全Number(int|float|complex|bool),要么全序列)。 入参是序列的话: 单序列入参,返回序列中最大的一个数值多序列入参, 按索引顺序,逐一…

Linux Mount Windows域用户限制的共享文件夹

sud现在一直使用linux作为主要的办公os,但是最近公司统一使用windows域服务器了,共享就出现比较打的问题了,原因如下:1、linux下通常mount windows共享文件夹Linux下使用smbfs形式访问windows共享文件夹是众所周知的事情&#xff…

B-tree索引与Bitmap索引的对比测试

昨天发现一条语句没有走索引,检查发现表没有建相应索引,先建立B-tree索引,测试发现是全表扫描,检查表数据发现此字段的值只有2个,删除原索引又建立bitmap索引,发现还是全表扫描,再次检查数据发现2个值基本各…

python 将字符串转换成字典dict

JSON到字典转化: 输出dict类型 dictinfo json.loads(json_str)字典到JSON转化: 输出str类型 # 比如: info {name : jay, sex : male, age: 22} jsoninfo simplejson.dumps(info) print jsoninfo Unicode到字典的转化: json.loa…

pidstat 命令详解(转载)

转自https://www.jianshu.com/p/3991c0dba094 pidstat 概述 pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu、内存、线程、设备IO等系统资源的占用情况。pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat将显示自上次运…

Oracle中table的大小计算方式

1. Check the size of each table on specific schema ; SQL> select segment_name,bytes/1024/1024 as mb from user_segments; SEGMENT_NAME MB -------------------- ---------- SALES 542. 转载于:https://www.cnblogs.com/jeff…

python编码问题无法复现_Python编码问题详解

1. 基本概念 字符集(Character set) 解释:文字和符合的总称 常见字符集: Unicode字符集 ASCII字符集(Unicode子集) GB2312字符集 编码方法(Encoding) 解释:将字符对应到字…

重新开始 2011/11/25

在csdn上写过几篇文章,始终没有坚持下来,也是由于自己没有一个明确的目标的缘故;当自己感觉乱的时候,总是想改变点东西,重新开始,改变了博客类的东西就真的能重新开始吗?现在我想换个博客就换个…

【转载】springboot:如何优雅的使用mybatis

这两天启动了一个新项目因为项目组成员一直都使用的是mybatis,虽然个人比较喜欢jpa这种极简的模式,但是为了项目保持统一性技术选型还是定了 mybatis。到网上找了一下关于spring boot和mybatis组合的相关资料,各种各样的形式都有,…

c3p0连接池用法

使用连接池的时候并不是在代码中不用获取/释放数据库连接,而是在代码中向连接池申请/释放连接,对于代码而言,可以把连接池看成数据库。 换句话说,连接池就是数据库的代理,之所以要使用这个代理是因为直接向数据库申请/…

我所理解的字符编码

1,Ascii和ebcic. 为了方便交流,美国人发明了ASCII编码,后来被确认为国际标准。后来以发明了EBCDIC编码。 一般地说,开放的操作系统(LINUX 、WINDOWS等)采用ASCII 编码,而大型主机系统&#xff0…

void函数调用时显示不允许使用不完整的_C语言的角落——这些C语言不常用的特性你知道吗?...

变长参数列表头文件定义了一些宏,当函数参数未知时去获取函数的参数变量:typedef va_list宏:va_start()va_arg()va_end()va_list类型通过stdarg宏定义来访问一个函数的参数表,参数列表的末尾会用省略号省略 (va_list用来保存va_st…

centos下为firefox安装flash插件的几种方法

首先去官网去下载RPM格式的安装包,比如:flash-plugin-11.1.102.55-release.i386.rpm,默认下载位置是该用户的下载文件夹。 方法一:用gnome 双击该文件,按提示操作即可。 方法二:命令行,在该文件…

eoLinker AMS 专业版V3.3发布:分享项目可以测试并选择分享内容等

eoLinker AMS是集API文档管理、API自动化测试、开发协作三位一体的综合API开发管理平台,是中国最大的在线API管理平台。目前eoLinker AMS已经为来自全球的超过两万家企业托管超过一百万的API,我们感谢每个曾经以及正在支持我们的企业以及开发者朋友&…

MyBatis基础-CRUD

一、mybatis 环境搭建步骤 第一步:创建 maven 工程第二步:导入坐标第三步:编写必要代码(实体类和持久层接口)第四步:编写 SqlMapConfig.xml第五步:编写映射配置文件第六步:编写测…

python答题系统的代码_Python考试系统自动答题(教务处)

要求 某学校要求登录教务处网站 做一个测试题 30分钟300道题,240分几个,题量不少,题还不好做。 研究发现原来在网站上有题库 但是一道题只有6s 的时间作答 边查边做时间不够 人生苦短,何不Python当歌? 来个自动答题的智…

((ios开发学习笔记九)) Simple TableView 实现(附 实例源码)

实现效果: 实现过程: Step One 创建单个窗体项目 Step Two 创建control 接口 Step Three 创建窗体和关联关系 Step four 实现table view 的接口 control 初始化选择数据 实现Data Source 部分 实现TableView委托部分 源码下载 TestTableView.zip转载于:…

24个为Web开发人员准备的CSS3实用教程

本文搜集了一些关于CSS3的最新教程。你可以根据这些教程或技术来实现网页设计,包括:文字阴影、圆角框、盒模型尺寸计算(box sizing)、透明效果处理、多重背景、边框图像等。以下这些都是非常实用的CSS3教程,提供了许多…

前端基础之JQuery

一、什么是JQuery [1] jQuery由美国人John Resig创建,至今已吸引了来自世界各地的众多 javascript高手加入其team。 [2] jQuery是一种新型的JavaScript库。jq是用js写的,能用jq实现,用js都能…