Node.js的人性化
发布于 8个月前 作者 yingjie0904 489 次浏览

NODE要比JavaScript在服务器上运行得多多了。

这是Node的聪明之处,对吧!现在你可以同时写服务器端和客户端的JavaScript。

当你不得不从客户端转移到服务器端或反过来,这个过程极其痛苦,一部血泪史。如今,你再也不用再埋头苦读,穿梭于不同环境之间了。


希望各位能注意到我的讽刺。

Node使用JavaScript仅仅是一个第三方点,有舍有得(对有些人有利,有些人有害)。可以肯定的是,这对于Node的成功有很大贡献,但是太多了,以致于Node的根本点和目的会经常丢失。如果这对你来说是显而易见的,那么你可以不用读此文了。

说你喜欢Node是因为可以在服务器端写JavaScript代码,就像说你喜欢红色 Lotus Elises是因为它们是被漆成红色一样。不是每一个人都喜欢红色,而且就算是每个人都喜欢,这也不是让这个车如此受欢迎的最重要理由。

NODE与目前的动态语言现状有着根本区别。它是由对效率的极度痴迷而产生的。人们对线程与连接之间经典1对1模式的不满,让它有能力处理显著增长的用动态语言为web应用写的并发等级。

###阻塞和IO问题

不管WEB还是其它应用的瓶颈都是IO引起的。

应用一般都是由数据库,文件系统,网络,或这些介质结合起来来传送/接收数据的。通常,这些信息的传输速度比直接在内存中操作的速度要慢。CPU的过量使用似乎不是你的问题。

第二个问题是我们开始处理问题的方法。从历史的角度上理解电脑,我们能有序地思考。这就是电脑思考问题的方式,对吗?你提供一大堆的指令,然后电脑从上到下有序的执行。你的第一个程序大概像下面这样子:

// print
console.log("Enter your name: ");

// block execution to retrieve data
// keeping the process tied up awaiting the
// data's return
var name = console.read();

// manipulate data and report
console.log("Hello " + name + "!"); 


但是如果你能以非阻塞方式做的话

// print
console.log("Enter your name: ");

// make a request for the data, but allow the process to
// be free to do other things, providing a bit of code
// to run when the data is retrieved.
console.read(

  // When we are notified we have a
  // response, manipulate data and report
  function(err, name) {
    console.log("Hello " + name + "!");
  }
);


让你的进程阻塞、等待数以百万计的时钟周期将很浪费时间和资源。为了处理额外的请求,某些情况下你必须使用进程管理器来管理这些线程。为了让web逐渐更具媒体交互性,我们不断地减少每个请求的大小,虽然这些不断增加的请求是由每个单独的客户端发起的。这让为什么请求与进程之间1对1关系很难衡量变得很明显。

站在历史的角度上,我们让自己能够更简单地以第一种风格来说服我们的程序,但我认为第二种方式也是一样的,如果没有太多,像人类一样进行敏锐的判断。

###像人类一样思考

作为人类,你知道信息流的异步本性。你凭直觉知道,这仅仅只是没有效果和实用性来阻止每次你需要检索或传达信息时所做的所有事情。

作为一个开发者,你每次向经理或股东询问一个项目的详细情况时,你会简单地坐着然后安静地等待回复吗?不,当然不会。你移步到下一个你能取得进展的事情上,欺骗一个单方面很充分的重要任务。一旦信息复原,就继续相关任务。

举个更通俗的例子,你在开车,旁边是你的朋友,你需要知道明天的天气情况。你会刹车、不管交通秩序就面向你的朋友问他明天天气吗?你会沉默的等待(除非后面的人按喇叭)直到他查询完天气?当然不会,当他告诉你天气情况时,你会继续和他聊别的东西。

在这种方式下,Node的非阻塞/异步模型在第一次传递时并不需要变得异质。

###为什么不用线程

线程困难,繁重,大材小用。

他们确实解决了平行的基本问题,但他们提出一个围绕着线程安全和易变性的全新问题。如果要实施的话,对于动态语言来说它们通常很复杂且很难解决。

在Node中,除了你的代码,所有东西都平行运行着。

对于你来说,所有事情都可以通过平行来解决。但是由于你的代码永远不会平行的运行,且通常都在单线程中,线程安全和易变性就没有了。这给一般用例的平行化带来了好处,不需要给开发者额外的复杂度。

我认为Node处理平行化的方法再次反应出我们人类过程思考的方式,并不是并行的,但是高效的多任务。

###某某语言也有非阻塞服务

我确信肯定有,当你想用不会导致阻塞的第三方包模型时,它可能是有用的。非阻塞被开发社区很哲学化地应用了。这是规则,不是例外。

此外,围绕着异步性的事件循环和支持性基础通过低级语言很好的实现了(V8,libev,libeio等等)。其他许多动态语言的非阻塞服务将利用这样的库,但创造性的是用它们的动态语言来实现。在这种情况下,当与Node的实现相比时,性能是要特别关注的。

所有语言或平台都是有折衷的,但希望我的想法能让Node在作为实用性问题解决方案和有意思的学术实践两方面都更具独特之处。


By Jonathan D. Johnson

From:http://jondavidjohn.com/nodejs-is-human/?utm_source=ourjs.com

回到顶部