当前位置: 首页 > news >正文

nodejs --- 核心概念

  nodejs是2009年有Ryan Dahl利用google的V8引擎打造的基于事件循环实现的异步I/O框架,它选择JavaScript作为开发语言,正是因为V8的性能远超过其他脚本语言。目前express、socket.io这样的node框架在github上都有着极高的排名。国内的公司如阿里巴巴、网易、腾讯、新浪、百度等公司的很多线上产品都纷纷改用node并且取得了很好的成果。

  我们可以通过nodejs搭建服务器,这样就可以发送请求和接收数据了。

 

    推荐使用https://zealdocs.org这个离线node的api文档,多看看文档有好处。 

 

 

第一部分:nodejs实例

  1. nodejs和js相同之处: 打开gitbash,输入node随即进入了node环境,然后输入console.log("hellow world");可以发现就已经成功输出hello world 了! 如下所示:

  

  2. nodejs和js不同之初: 打开console控制台,输入window,可以发现window这个全局变量中有很多的属性,而在node中输入却是无效的,提示window is not defined。 在node 中输入process (这是node的全局变量),可以发现输出如下:

  

  这里process中包含了node的各种信息,即版本号、npm等等,而把它输入到console控制台中,我们可以发现process是未定义的。 这就是node 和 js 不同之处。

  

 

 

第二部分:nodejs特点

  node虽然是后台语言,但是它保留了前端浏览器JavaScript中那些熟悉的接口,并没有改变语言本身的任何特性。

    

  特点一: 异步I/O

  我们知道再发出一个ajax请求之后,ajax默认是异步的,也就是说发出请求后并不会影响后续代码的执行,如下所示:

$.post('/url',{title:'nodejs'},function(data){
    console.log("我是先发送的ajax请求");
});
console.log("我是后发送的js语句");

  正是由于ajax是异步的,所以上面的代码中"我是后发送的js语句"是先输出的,因为在调用$.post()之后,后续代码是立即执行的,而“我是先发送的ajax请求”的执行时间是不被预期的,这样的好处就是你发送你的ajax请求,并不会影响后面的程序的程序执行,从而使得代码的执行效率提高。

  node中异步I/O也是非常常见的,正如ajax一般,举例如下:

var example = require('example');
example.doSomething('/path',function (error,file) {
    console.log("读取文件完成");
});
console.log("发起读取文件");

  这就是nodejs,常常会用到require方法来获取一个模块,这里“发起读取文件”是在“读取文件完成”的语句之后,但确实最先输出的,这就体现了node的异步I/O特点。

  在node中,绝大多数的操作都是以异步的方式进行调用。意义是:每个调用之间无需等待之前的I/O调用结束,在变成模型上可以极大的提升效率。

example.doSomething('/path',function (error,file) {
    console.log("文件完成");
});
example.doSomething('/path',function (error,file) {
    console.log("读取文件");
});

  如这两个语句总共的完成时间取决于两者耗时最长的一个。 而如果采用同步I/O的方式, 两个语句的完成时间将是两者之和。

  为什么要使用异步I/O呢?因为通过异步I/O,在异步操作后面的语句就可以立即执行,而不会等待这个I/O执行结束之后再执行,另外,我们知道,因为是异步I/O,尤其是在node端,可能会有很多读取文件的操作,readFile等等,虽然cpu很快,但是去硬盘中读取文件的这个I/O操作是很慢的,所以为了增加效率,提高cpu的使用率,我们就可以使用异步I/O的方式,使得后面语句的执行不会受到前面的I/O操作的影响,这就是异步I/O操作的好处了。

  那么究竟是怎么样的机制支持了这样的异步I/O呢,我们可以仔细考察一番。

  首先,我们需要知道的时异步 !== 多线程, https://stackoverflow.com/questions/34680985/what-is-the-difference-between-asynchronous-programming-and-multithreading。把这个看完了就知道同步、异步单线程、异步多线程的区别了。  

翻译

  对于异步和多线程,你的误解是非常普遍的。 很多人被告诉: 多线程和异步是同一回事,但实际上并不是这样的。

  一个类比通常是有用的。 场景:  你在饭馆里做饭,你个订单来了 --- 需要鸡蛋和烤面包。

  • 同步: 你第一步开始煮鸡蛋,做完鸡蛋之后在烤面包。
  • 异步,单线程: 你开始煮鸡蛋时设置一个定时器。 你又开始烤面包,又使用了一个定时器。 当这两个都被烹饪的时候,你便在打扫厨房。 当定时器停止运转的时候,你把鸡蛋从锅里拿出来然后从面包机里把烤面包拿出来。最后给server。
  • 异步,多线程: 你又雇了另外两个厨师。 一个厨师去专门煮鸡蛋,另外一个专门去烤面包。 所以现在你的问题就在于如何协调好两个厨师的合作以至于他们不会产生冲突(当分享资源的时候),然后你给他们付钱就好了。 
译者注:我们可以这里理解,这里的 你 就是cpu, 也就是人类的大脑。 当同步的时候,你需要一个一个地去做,你也是负责指挥工作,比如煮上鸡蛋、定时,而在煮鸡蛋的时候,即煮鸡蛋的工具就不是cpu干的了,这个cpu会一直盯着,盯着鸡蛋煮完,然后去开始做其他的工作。 当异步多线程的时候, 你这个cpu又找了几个人来干活,就是多线程,显然,多线程的资源分配是cpu需要协调的问题。
总之: cpu并不是把所有的工作都做了,而是做主要的指导,相当于政委,真正干活的还是其他的一些部件,比如外部设备等。

  现在, 多线程仅仅是异步的一种,有什么意分配任务给workers。 在单线程异步的工作流中, 你有一个任务表,并且这些任务决定于其他任务的结果(多线程异步不是这样的),因为每个任务完成之后,就会提醒代码,这个代码就会去安排下一个任务,给出刚刚完成任务的结果。 但是你仅仅需要一个worker去完成所有任务,而不是一个worker完成一个任务。

   这将会帮助你实现实现很多处理器限制的任务。对于有处理器束缚的任务,他将会变得有意义,即雇佣尽可能多的workers(线程),给每一个任务都分配一个线程, 给每一个worker分配一个处理器,并且使得每一个处理器尽可能快的完成任务。 但是对于很多任务来说, 他们根本就不需要cpu处理器,所以你不需要给他们单独都分配一个worker。你只是需要等待一个消息,就是他完成了,然后就可以去接着做了。 当信息到达的时候,你就可以继续做安排好的任务。 

 

 

 

 

 

  特点二:事件与回调函数

  与其他后端语言不同,node将前端浏览器中运用广泛且成熟的事件引入后端,并配合异步I/P|O,将事件点暴露给业务逻辑。

var http = require("http");
var querystring = require("querystring");

// 侦听服务器的request事件,req 为 request ,res 为 respond
// node既然为后台语言,就可以建立服务器,服务器就是用于request(接收请求)和respond(响应请求)的。
http.createServer(function (req,res) {
    var postData = '';
    req.setEncoding('utf8');
    //侦听请求的data事件,一旦有了请求,就触发事件,postData(将要返回的data)就加上trunk
    // 和jquery类似,使用on 来绑定事件
    req.on('data',function (trunk) {
        postData +=trunk;
    });
    //侦听请求的end事件
    req.on('end',function () {
        res.end(postData);
    });
}).listen(8080);
console.log("服务器启动完成");

  于是我们可以看到node是可以绑定事件的,还可以链式调用,另外大量使用回调函数也是一大特色,值得注意的是------回调函数是最好的接受异步调用返回的数据的方式

   

 

  特点三:单线程

  和js一样,node也保留了单线程的特点。注:http://www.ruanyifeng.com/blog/2013/04/processes_and_threads.html 对进程和线程做了较为形象的讲解。

  单线程的最大好处在于不用像多线程那样出处在意状态的同步问题,这里没有死锁的存在。缺点就是无法利用多核cpu,错误会引起整个应用退出,应用的健壮性值得考验。

  

  

  特点四:跨平台

  起初的node只能在linux系统上使用,后来微软帮助其使得可以在windows操作系统上使用。

  

  

 

第三部分:node应用场景

  我们都知道node,但是它具体会在什么情况下使用呢?

       I/O 密集型

  刚刚我们提到了node的特点之一就是异步I/O,这样可以大大提升单线程情况下处理I/O的效率,于是对于I/O密集型的应用场景使用node是最好的,它能够有效的组织起更多的硬件资源,从而提供更好地服务。

  node使用者

    1.   前后端编程语言环境统一。   代表是雅虎,将YUI3这个框架的能力借助node延伸到服务器端,使得使用者摆脱了日常工作中一边写JavaScript一边写PHP所带来的上下文交换负担。
    2.      Node带来的高性能I/O用于实时应用。   腾讯使用提供实时功能,花瓣网、蘑菇街使用socket.io实现实时通知的功能。
    3.      游戏开发领域。  网易开源了pomelo框架,可以在游戏和高实时应用中使用。

  

 

 

 

 

 

  nodejs学习资源

  慕课网、网易云课堂

  nodejs.org 即nodejs官网 

  npmjs.org 

  github.com 阅读源码可以很快地提高

  stackoverflow  这里有大量的答案可以寻找,可以解决我们常见的问题。

http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html  入门教程

 

相关文章:

  • LNMP搭建6:Nginx用户认证
  • 搭建DHCP服务器
  • Linux命令篇之cat命令,tac命令和rev命令
  • Eclipse Ant 批量多渠道打包(二)
  • js数组操作大全
  • Godaddy ssl续费更新问题总结
  • VMware + OpenStack: 从 Plugin 到 VIO (VMware Integrated OpenStack)的演进
  • 反转字符串中的单词
  • 开始51CTO的博客经营
  • 微信小程序把玩(二)window配置
  • Lucene.net站内搜索—2、Lucene.Net简介和分词
  • 201521123040《Java程序设计》第1周学习总结
  • Android内存管理之道
  • 关于二维数组求解面积的问题
  • 算法设计 - LCS 最长公共子序列最长公共子串 LIS 最长递增子序列
  • ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
  • android图片蒙层
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • Electron入门介绍
  • HomeBrew常规使用教程
  • JavaScript的使用你知道几种?(上)
  • Java-详解HashMap
  • 翻译--Thinking in React
  • 每个JavaScript开发人员应阅读的书【1】 - JavaScript: The Good Parts
  • 如何选择开源的机器学习框架?
  • 算法---两个栈实现一个队列
  • 王永庆:技术创新改变教育未来
  • postgresql行列转换函数
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 数据可视化之下发图实践
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • #Linux(权限管理)
  • #预处理和函数的对比以及条件编译
  • (2)STL算法之元素计数
  • (Python) SOAP Web Service (HTTP POST)
  • (第61天)多租户架构(CDB/PDB)
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm经济信息门户网站 毕业设计 141634
  • (免费领源码)python+django+mysql线上兼职平台系统83320-计算机毕业设计项目选题推荐
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (转)Sql Server 保留几位小数的两种做法
  • .mkp勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .mysql secret在哪_MySQL如何使用索引
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .net 设置默认首页
  • .net 提取注释生成API文档 帮助文档
  • .net 逐行读取大文本文件_如何使用 Java 灵活读取 Excel 内容 ?
  • .Net中间语言BeforeFieldInit
  • @ModelAttribute 注解
  • @Transaction注解失效的几种场景(附有示例代码)
  • [2016.7 test.5] T1
  • [AutoSar]BSW_Memory_Stack_004 创建一个简单NV block并调试
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [CVPR 2023:3D Gaussian Splatting:实时的神经场渲染]