问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

nodeJS中,异步的具体实现者是什么

发布网友 发布时间:2022-04-20 00:55

我来回答

2个回答

热心网友 时间:2022-07-12 23:15

在现在的项目开发中,任何一个大型项目绝对不是简简单单的采用一个种语言和一种框架,因为每种语言和框架各有优势,与其死守一个,不与取各家之所长,依次得到一个高性能、搞扩展的产品。

对于一个.NET开发者,尤其是主要从事Web开发的.NET程序员,个人觉得有必要学习一门性能优越的Web平台开发语言。一个开发者不能简简单单的只学习一门语言,思维应该开阔,从各个方面去看待同样的一个问题,这样或许会得到另一番效果和见解,个人认为应该学习一下其他的语言,这样有利于我们对比语言的优势和缺点,例如java、nodejs、python等等。对于Nodejs这个JavaScript平台,个人觉得.NET程序员有必要学习一下,因为学习NodeJS有助于我们构建一个高性能的Web平台。

NodeJS具有事件驱动、非阻塞I/O等特点,可以很好的处理I/O操作。Node面向网络且擅长并行I/O,能够有效地组织起更多的硬件资源。

这篇博客就来简单的介绍一下NodeJS的异步I/O特点。

一.NodeJS概述:

要学习一个语言或者平台,我们首先应该知道其定义,依据定义来扩展我们的学习思路。Node的定义:”一个大奖在Chrome JavaScript运行时上的平台,用于构建高速、可伸缩的网络程序。NodeJS作为一个异步事件驱动的JavaScript运行时,旨在构建可扩展的网络应用程序。“有关nodejs的背景介绍和安装方法,这里就没有必要介绍了,因为对于nodejs的安装是比较简单,所以在这里赘述就有些显得浪费时间。

学习完Node的定义特点,可能很多人都会好奇这个平台的适用场景是什么,以便在实际的项目开发中应用,不然学习这个就没有意义。主要的应用场景:前后端编程语言环境统一;高性能I/O用于实时应用;并行I/O使得使用者可以更高效地利用分布式环境;并行I/O有效利用稳定接口提升Web渲染能力;云平台的支持;游戏开发(这可能是很多开发者在意的,毕竟现在的游戏开发火热程度已经到了无以附加的地步);工具类应用,与较多的工具方法,使得开发效率大大的提升。

NodeJS异步I/O模型的基本要素:事件循环、观察者、请求对象、I/O线程池这四个共同构成。接下来我们具体了解一下这些知识。

二.NodeJS异步I/O解析:

对于Nginx服务器,很多人都是比较的熟悉,Nginx采用纯C编写而成,用于做Web服务器,在反向代理和负载均衡等服务方面有很好的优势。Node与Nginx服务器有着相似的地方,都是采用事件驱动。

浏览器中JavaScript在单线程上执行,而且还与UI渲染共用一个线程,JavaScript在执行的时候UI渲染和响应应是出于停滞状态。(如果脚本执行的时间超过100毫秒,用户就会感到页面卡顿)。遇到这些情况,我们就会想到异步的方式消除这些等待的问题,对于异步和同步的概念就不做介绍了。

=接下来我们具体的来了解一下NodeJS的事件驱动和非阻塞I/O这些特点,了解这些对于我们更好的学习NodeJS开发和构建高性能的Web平台有更加深远的意义。

1.I/O操作概述:

I/O操作对于任何一个开发者来说都不会陌生,现在我们就简单的谈一下NodeJS的I.O操作。I/O操作分为:单线程串行依次执行;多线程并行执行。这两种方式各有优势和缺点,多线程的代价在于创建线程和执行期线程上下文切换的开销较大,并且多线程面临锁、状态同步的问题。单线程安装顺序执行,在执行中任何一个稍慢都会导致后续执行代码阻塞。对于任务的串行执行(概念上类似于同步执行)和任务的并行执行的描述有如下图:

                        

在NodeJS中利用单线程,远离死锁、状态同步问题,利用异步I/O,让单线程远离阻塞,以便更好的使用CPU。异步I/O是期望I/O的调用不再阻塞后续运算,将原有等待I/O完成这段时间分配给其他需要的业务去执行。   

很多时候一些开发者对异步/同步和阻塞/非阻塞的概念有些分不清,这两者没有什么关联。阻塞I/O是调用之后一定要等到系统内核层面完成所有操作后,调用才结束。非阻塞I/O是在调用后立即返回。关于阻塞I/O和非阻塞I/O有如下图:

2.NodeJS异步I/O解析:

事件循环:在进程启动时,Node会创建一个类似于while(true)的循环,每执行一次循环体的过程称为Tick,每个Tick的过程就是查看是否有时间待处理。

观察者:每个时间循环中有一个或多个观察者,判断是否有事件要处理的过程就是向这些观察者询问是否又要处理的事件。

请求对象:从JavaScript发起调用到内核执行完I/O操作的过渡过程中,存在一种中间产物,就是请求对象。

I/O线程池:组装好请求、送入I/O线程池等待执行,完成第一步I/O操作,进入第二部分回调通知。(在Windows中,线程池中的I/O操作调用完毕之后,会将获取的结果存在req->result属性上,然后调用PostQueuedCompletionStatus()通知IOCP,告知当前对象操作已经完成。)

异步I/O有如下图:

三.NodeJS异步编程实例:

前面介绍了异步I/O的相关概念,这里提供一个异步I/O操作的实例:


var config = require('./config.json');
var fs = require("fs");
var http = require('http');
var url_mole = require("url");
 
http.createServer(function (request, response) {
  var key = url_mole.parse(request.url).query.replace('key=', '');
  switch (request.method) {
    case 'GET': // Asynchronous Response Generation
      fs.readFile(config.dataPath + key, 'utf8', function(err, value) {
        if (err) {
          // Return File Not Found if file hasn't yet been created
          response.writeHead(404, {'Content-Type': 'text/plain'});
          response.end("The file (" + config.dataPath + key + ") does not yet exist.");
        } else {
          // If the file exists, read it and return the sorted contents
          var sorted = value.split(config.sortSplitString).sort().join('');
          response.writeHead(200, {'Content-Type': 'text/plain'});
          response.end(sorted);
        }
      });
      break;
    case 'POST': // Synchronously append POSTed data to a file
      var postData = '';
      request
        .on('data', function (data) {
          postData += data;
        })
        .on('end', function () {
          fs.appendFile(config.dataPath + key, postData, function(err) {
            if (err) {
              // Return error if unable to create/append to the file
              response.writeHead(400, {'Content-Type': 'text/plain'});
              response.end('Error: Unable to write file: ' + err);
            } else {
              // Write or append posted data to a file, return "success" response
              response.writeHead(200, {'Content-Type': 'text/plain'});
              response.end('success');
            }
          });
        });
      break;
    default:
      response.writeHead(400, {'Content-Type': 'text/plain'});
      response.end("Error: Bad HTTP method: " + request.method);
  }
}).listen(config.serverPort);
 
console.log('synchronous server is running: ', config.serverPort);

四.总结:

这篇博文是个人初次尝试NodeJS的一个小总结,如有写的不好还望大家多多的包含和指正。对于程序员来说,需要做的就是一直不停的学习,无论是否是自己主要从事的语言,对于学习多种语言,可以更加有助我们了解编程,对于一个开发者来说,最终的就是思想,因为语言的特性和框架的应用,一个熟练的编程者学习起来并不是难事,难就难在我们对于语言和框架的设计理念的理解。

热心网友 时间:2022-07-12 23:15

在JS中,异步的实现依靠AJAX。
在底层实现中,实现ajax的源头是XMLHttpRequest对象,通过创建XMLHttpRequest对象并使用其方法传递请求,接收数据来实现异步操作。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2024年小麦价格多少钱一斤 酸甜口味的凉拌菜如何制作? 小麦价格什么时候涨 明年小麦还会继续上涨吗 怎么做家常韭菜烧豆腐? 家常烧豆腐块怎么做? 单核CPU512内存 加内存会让电脑运行快吗 我的电脑配置 CPU AMD速龙 双核 3600+ 内存 512MB 显卡64M 什么情况... 我的cpu是AMD Sempron 3000+的 内存是512M 显示卡是 Radeon X300/X550/... 我的电脑是双核CPU 2G内存 512独显 怎样才能加快电脑运行速度 nodejs适合开发oa吗 想用nodejs 做电商, 可行吗? NodeJS什么都能做,为什么还要JAVA 如何选择Node.js Web开发框架 写手游服务器,java和nodejs哪个好 开发大型Web应用是用php+mysql+extjs 还是 nodejs+ node.js能开发大型网站吗 Node.js适合做主流大型系统吗 dell笔记本的屏幕的对比度怎么调 戴尔笔记本怎么调节屏幕颜色 戴尔笔记本电脑开机后屏幕很暗,无法调节亮度。 戴尔笔记本屏幕显示很模糊有阴影什么问题 戴尔笔记本屏幕很暗,几乎黑屏 戴尔笔记本电脑屏幕亮度调节不了。屏幕很暗,怎么... dell笔记本电脑屏幕花屏是什么原因导致的? 笔记本显示屏太亮,怎么调暗些?(DELL) 戴尔笔记本电脑打开软件后,屏幕看起来很模糊,这... 戴尔笔记本电脑屏幕很暗亮度调到最高了也没反应,... DELL笔记本电脑屏幕变黑 戴尔笔记本电脑能开机,就是显示屏很暗,其他都很正常 现在还有nodejs开发的吗 有用nodejs做物联网项目的吗 用nodejs做项目,要部署在客户服务器,怎么能防止j... nodejs用什么框架比较好 nodejs 项目如何发布 微信视频不能打开手电筒了 2019天津高考满分作文(和祖国一起前行)算议论文吗? iphone 钢化膜全屏和非全屏的有什么区别 2019高考英语满分作文 天津高考满分多少分? iPhone全面屏系列手机,贴钢化膜是全屏的好还是非... 天津高考总分多少? 苹果手机贴膜,半屏还是全屏的好? 天津高考考几门?满分是多少?谢谢? 6s贴膜是全覆盖的好还是非全覆盖的好,钢化膜还是... 2019年天津高考的作文题目是什么 钢化膜全覆盖好还是非全覆盖 天津高考满分多少分? 2019年天津高考语文作文标题 2019年天津高考满分作文800字-说说我们90后