读书笔记之《深入浅出Node.js》(2)

原创 2016年05月30日 17:25:12

上一篇读书笔记中中我们讲到了异步,这里不得不提一下Promise,现在的ES6已经原生支持Promise对象。所谓的Promise对象,其实就是一个异步操作,使用Promise的好处在于,我们可以把异步操作用同步的方式来写,避免了层层嵌套的回调函数(俗称callback hell)。以下的内容主要来自陈天大大的一篇文章讲Promise的文章,然后又加上了Node.js中Promise的一种实现方法。

Promise的状态机

简易版状态机
具体代码逻辑
具体代码,这里首先连接数据库,然后打开某一个某,最后插入数据,一个三层的嵌套
具体代码例子
用Promise改造后就变成类似同步方法的写法,其中为了实现链式调用,每一个then语句中都要返回一个Promise对象,且最后的catch语句处理之前的then语句中发生的所有异常。
Promise改造后的代码
下面是我自己写的一个实现了链式调用Promise且能在得到不想要的结果时退出的一段代码

<script type="text/javascript">
  var getDate = function(url) {
    var promise = new Promise((resolve, reject) => {
      var xhr;
      if (window.XMLHttpRequest) {
        xhr = new XMLHttpRequest();
      } else {
        xhr = new ActiveXObject("Microsoft.XMLHTTP");
      }
      xhr.onreadystatechange = handler;
      xhr.open("GET", url);
      xhr.send(null);
      function handler() {
        if (this.readyState === this.DONE) {
          if (this.status === 200) {
            resolve(this);
          } else {
            reject(this);
          }
        }
      }
    });
    return promise;
  }
  getDate("http://127.0.0.1:3000/data").then(function (data) {
    //判断结果,若不是Frontend,则直接抛出异常,跳转到最后的catch语句中
    if (data.response !== "Frontend") {
      throw "Error";
    }
    console.log('Correct');
    //再次返回一个Promise对象,实现链式调用
    return getDate(data.responseURL)
  }).then(function (data) {
    console.log(data.response);
  }).catch(function (err) {
    console.log(err);
  });
</script>

第五章 内存控制

背景

因为Node.js处于服务器端,所以内存的问题就必须重视起来,这里与浏览器中很少会碰到内存的一些问题,很多时候当发生垃圾回收造成页面加载缓慢时,用户一般就不耐烦地刷新了页面。但是在Node.js中,面对海量请求的时候,哪怕是一丁点的内存泄漏也会越积越多,最后造成服务器的崩溃!

介绍

首先,Node.js使用V8作为执行引擎,所有它的内存管理是交给V8来实现的。Node.js中的内存分为两部分:

  • V8分配的内存(受内存管理的限制),在32位系统下默认为0.7GB,64位系统下默认为1.4GB,但这个限制可以在启动Node时改变。
    node --max-old-space-size=2400 app.js //指定老生代内存大小,单位为MB
    node --max-new-space-size=1024 app.js //指定新生代内存大小,单位为KB

  • Node自行分配的内存(例如Buffer对象,不受到V8内存管理的限制,在处理几个GB的大文件时特别有用)。
    同时在V8中,内存被分为两部分:

    • 老生代(占比98%,存放存活时间较长的对象 ,应用Mark-Sweep和Mark-Compact算法)
    • 新生代(占比2%,存放存活时间较短的对象,应用半空间复制算法Scavenge)

V8中一次小的垃圾回收要50ms,一次大的非增量的垃圾回收要1s以上,这是几乎无法忍受的,所以它内部通过各种算法来优化垃圾回收,算法细节有兴趣的可以自行Google。

我们可以通过分析V8执行时的日志来查看垃圾回收所占用的时间,用如下的方法来启动Node
启动Node并生成日志,这样在根目录中会生成对应的日志文件,如下图所示:
日志文件
对应的GC.js文件的代码

for (var i = 0; i < 1000000; i++) {
  var a = {};
}
for (var j = 0; j < 1000000; j++) {
  var b = {};
}

然后在安装了tick模块后,我们就可以看到垃圾回收实际产生的影响了。这里我是在WebStrom中直接用集成好了的工具来做的,省时省力。
WebStorm中集成的分析工具
分析结果如下图
分析结果
从结果里可以看到,由于不断分配对象,垃圾回收所占的比列为1%(我的Node版本是6.2.0,已经对垃圾回收做了很多优化),这意味着事件循环每执行1000ms,就要抽出10ms的事件来执行垃圾回收。

高效使用内存

为了高效使用内存,我们在开发中要注意几点:

  • 减少全局变量的使用,通过重新赋值(null或undefined)来释放全局变量,虽然删除对象也可以取得相同的效果,但删除对象有可能干扰到V8的垃圾回收机制,所以采用重新赋值的方法来解除占用会更好。
  • 减少闭包的使用
  • 不要把内存当做缓存,这样会干扰垃圾回收,且还要自己制定缓存的过期策略,推荐使用Redis或者Memcached。

大内存应用

在需要操作大文件时,由于V8内存的限制,不能直接通过fs.readFile()和fs.writeFile()进行操作,而是需要用到stream模块或者继承stream的模块。代码如下

var fs = require('fs');
var reader = fs.createReadStream('../../public/v8_log.log');
var writer = fs.createWriteStream('../../public/v8_log_copy.log');
reader.on('data', function (chunk) {
  writer.write(chunk);
});
reader.on('end',function(){
  writer.end();
});
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

小试牛刀-前端预加载技术

碎碎念:来了阿里之后一直各种忙,熟悉项目、配置、开发流程、内部权限,没多少时间写博客,其实这样是不好的,因为长时间不写博客,你会发现自己在技术上就没有什么进步的点,自然也就不写博客了,所以,博客必须得...

读书笔记之《深入浅出Node.js》(1)

碎碎念:距离上一次写博客已经过去了一个月,说好的半个月写一篇博客(自己打自己脸-。-)没有实现。其实主要这一个月都在看书,感觉没啥好写,但后来灵光一现,直接写读书笔记啊!把书上的一些知识点、重点用博客...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

《深入浅出NodeJS》读书笔记

NodeJS NodeJS 4个特点: 异步I/O, 事件驱动与回调, 单线程事件轮询,跨平台。 NodeJS 5个大坑:异常处理,嵌套太深,没有Sleep,多线程编程,异步转同步。 NodeJ...

读书笔记之《深入浅出Node.js》(3)

第六章 Buffer对象Buffer对象的适用场景:处理网络协议、操作数据库、处理图片、接受上传文件,特别是在网络流和文件的操作中,要处理大量的二进制数据,所以需要用到Buffer对象,且Buffer...

读书笔记之《深入浅出Node.js》(4)

第八章 构建Web应用在具体的业务中,我们有如下的这些需求(实际开发中一般用 Express框架,它帮我们做了很多事情),这里以访问 http://127.0.0.1/admin/head/on?so...

读书笔记——深入浅出node.js——构建http服务

朴灵大师的书确实不错,让我受益非浅。 个人理解,仅做参考。构建http服务在Web领域,大多编程语言需要专门的Web服务器作为容器,如ASP、ASP.NET需要IIS,PHP需要搭载Apache或Ng...

《深入浅出Node.js》读书笔记+个人思考(二):异步I/O

对异步的理解

JavaScript、jQuery、HTML5、Node.js实例大全-读书笔记2

根据功能设计,可以先写好 HTML 结构基础,再配好 CSS 做出大致效果,最后用 JavaScript加上各种动作。首先请看 HTML 代码结构。
  • kgsew
  • kgsew
  • 2014-10-24 11:27
  • 1174

[读书笔记]深入浅出NodeJS——Node中的异步I/O

JS执行是单线程的,但Node底层有一个线程池,使用多线程来实现异步I/O Node的异步I/O 几大要素:事件循环、观察者、请求对象、I/O线程池。 事件循环 进程启动,会创建一个whil...
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)