美文网首页
深入浅出nodejs

深入浅出nodejs

作者: PureProgramer | 来源:发表于2019-01-05 00:24 被阅读0次
    1. setImmediate()和process.nextTick()区别,前者是每个回调将再一次事件循环中执行,后者是将所有回调在同一次事件循环中处理,后者容易堵塞某轮事件循环

    2. setImmediate和setTimeout不确定哪一个会先加入事件循环,事件循环中应该是有多个观察者 如果恰巧当前循环执行到了 timeout的观察者则会先把timeout任务加入队列,不过也说明了

      2.1 当事件循环中某一轮 处理时间较长会阻塞后面的所有事件任务

    3. 当同步代码执行完才会执行事件循环

    4. 用对象的键值作为缓存时要注意释放,并且node中每个模块引入后就会缓存 所以每个模块的局部变量也是不会被释放的

    5. 进程之间无法共享内存

    6. Buffer,Stream属于堆外内存,不受v8堆内存限制,所以在读取大文件到内存时常用Buffer接收 或者 Stream

    7. Stream读写文件
      7.1 可以用pipe管道方法直接将流转移
      7.2 也可以用on("data",callback)来监听每块chunk读取进来,并用writeStream写入到流中,这种方式可以用来事实更新文件复制进度

    8. Buffer是已8K做分界单位的 如果声明两个Buffer加起来超过8k则会新建两个slab,如果两个Buffer小于8k则可以公用一个slab,所以尽量不要出现一个Buffer占用1k 另一个却占用8192k这种情况

    • 如果Buffer大于8k则会新建一个SlowBuffer对象作为slab单元,这个slab单元将会给这个Buffer独占,分配该Buffer的所有长度
    1. nodejs http模块是单线程 是基于事件模型实现的,接收到请求后会对应发送请求,等待事件循环去执行对应的观察者。也就是说如果有一个请求同步挂住了事件循环 则后面的任务都无法被执行

    即便是采用异步模型也没办法防止阻塞,因为无论如何 只要当事件循环执行到该任务时,后面的任务都会被挂载住,所以 耗时操作(cpu密集任务)必须使用多线程操作或者采用多进程
    nodejs优势在于io密集,弱势是cpu密集
    之所以单线程但是能高并发的原因是 所有的数据库操作 网络操作都是多线程的 所以事件循环只需要处理结果就行 不会有任何耗时操作在主进程里处理

    1. 开启cluster负载均衡 设置环境变量NODE_CLUSTER_SCHED_POLICY=rr

    相关文章

      网友评论

          本文标题:深入浅出nodejs

          本文链接:https://www.haomeiwen.com/subject/dxilrqtx.html