热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

node学习记录(一)

node的特点:它作为js的运行平台,node保留了前端浏览器js那些熟悉的接口,依旧基于作用于和原型链,区别在于它将前端中广泛应用的思想迁移到服务器。异步IO:关键字:异

node的特点:它作为js的运行平台,node保留了前端浏览器js那些熟悉的接口,依旧基于作用于和原型链,区别在于它将前端中广泛应用的思想迁移到服务器。

  • 异步I/O:

    关键字 : 异步,阻塞,回调,事件

    why:前端通过异步可以消除UI阻塞的现象;前端获取资源的速度也取决与后端的响应速度,采用异步获取的速度更快。

    eg: 面对两个相同的两个事件:
    同步:事件一请求结束后才允许第二个事件请求。
    异步:事件二的请求并不阻塞第二个资源,也就是第二个事件的请求并不会依赖事件一的结束,这样就可以享受并发的优势。

    how:
    node采用 单线程资源分配方式

    node选择:
    利用单线程,远离多线程死锁,状态同步等问题 ;
    利用异步I/O的方式,让单线程远离阻塞,以更好的使用CPU。

  • node的异步I/O

    单线程   事件循环   观察者    I/O线程池  请求对象
    
    • 事件循环
      它是node的自身执行模式,在进程启动的时候,node创建一个while(ture)循环–Tick,每个Tick就是查看是否有事件待处理,如果有,请求相应的回调函数进行处理,如果不再有事件处理,就退出进程。

    • 观察者
      观察者用来判断是否還有事件要处理。每个事件中有一个或者多个观察者,判断是否有事件要处理,就是向这些观察者询问是否有要处理的事件。

    • 请求对象
      请求对象是从JS发起调用到内核执行完成I/O操作过渡过程的一种中间产物,所有对象都保存在这个对象中,包括送入线程池等待以及I/O操作完毕后的回调处理。

    • 执行回调线程池中的I/O操作调用完毕,将获取的结果存储在req->result属性上。然后调用PostQueuedCompletionStatus(),告知对象操作已经完成,此方法之后会将线程归还线程池,然后提交状态。通过get()方法提取。

整个过程

异步调用(发起 ——封装请求对象——设置参数和回调函数——请求对象放入线程池等待)——线程池(执行请求I/O操作——将执行结果放在请求对象中——通知完成操作)——事件循环(获取完成的I/O交给I/O观察者——从观察者获取可用的请求对象——取出回调函数和结果调用执行——获取完成的I/O交给I/O观察者)

  • 非I/O的异步API

    • 定时器
      setTimeout();
      setInterval();
    • process.nextTick
    • setImmediate

 (未完待续)

推荐阅读
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 尽管Medium是一个优秀的发布平台,但在其之外拥有自己的博客仍然非常重要。这不仅提供了另一个与读者互动的渠道,还能确保您的内容安全。本文将介绍如何使用Bash脚本将Medium文章迁移到个人博客。 ... [详细]
  • spring boot使用jetty无法启动 ... [详细]
  • Web动态服务器Python基本实现
    Web动态服务器Python基本实现 ... [详细]
  • 本文将从基础概念入手,详细探讨SpringMVC框架中DispatcherServlet如何通过HandlerMapping进行请求分发,以及其背后的源码实现细节。 ... [详细]
  • 深入理解:AJAX学习指南
    本文详细探讨了AJAX的基本概念、工作原理及其在现代Web开发中的应用,旨在为初学者提供全面的学习资料。 ... [详细]
  • 在尝试通过自定义端口部署Spring Cloud Eureka时遇到了连接失败的问题。本文详细描述了问题的现象,并提供了有效的解决方案,以帮助遇到类似情况的开发者。 ... [详细]
  • Flutter 核心技术与混合开发模式深入解析
    本文深入探讨了 Flutter 的核心技术,特别是其混合开发模式,包括统一管理模式和三端分离模式,以及混合栈原理。通过对比不同模式的优缺点,帮助开发者选择最适合项目的混合开发策略。 ... [详细]
  • JUC并发编程——线程的基本方法使用
    目录一、线程名称设置和获取二、线程的sleep()三、线程的interrupt四、join()五、yield()六、wait(),notify(),notifyAll( ... [详细]
  • 在现代Web开发中,HTML5 Canvas常用于图像处理和绘图任务。本文将详细介绍如何将Canvas中的图像导出并上传至服务器,适用于拼图、图片编辑等场景。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • Node.js在服务器上的多种部署策略
    本文探讨了Node.js应用程序在服务器上部署的几种有效方法,包括使用Screen、PM2以及通过宝塔面板进行简易管理。 ... [详细]
  • 在Python编程中,经常需要处理文件下载的任务。本文将介绍三种常用的下载方法:使用urllib、urllib2以及requests库进行HTTP请求下载,同时也会提及如何通过ftplib从FTP服务器下载文件。 ... [详细]
author-avatar
mobiledu2502907423
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有