宝哥软件园

分析节点异步输入输出的实现

编辑:宝哥软件园 来源:互联网 时间:2021-09-05

在目前的项目开发中,任何大规模的项目绝对不是简单地采用一种语言和一个框架,因为每种语言和框架都有自己的优势。而不是坚持一个,我们会得到一个高性能和扩大的产品反过来。

对于一个. NET开发人员,尤其是主要从事Web开发的. NET程序员来说,学习一门性能优越的Web平台开发语言是很有必要的。一个开发人员不能简单的只学一门语言,而应该豁达一点,从各个方面去看待同一个问题,这样才可能得到另一种效果和意见。他个人认为应该学习其他语言,这有助于我们比较语言的优劣,比如java、nodejs、python等等。至于NodeJS,一个JavaScript平台,我个人认为是有必要的。NET程序员来学习它,因为学习Nodejs将帮助我们构建一个高性能的Web平台。

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

本博客将简要介绍NodeJS的异步I/O特性。

一、节点概述:

学习一门语言或平台,首先要知道它的定义,并根据定义拓展我们的学习思路。节点的定义:“在Chrome JavaScript运行时中授予的平台,用于构建高速和可扩展的网络程序。NodeJS作为异步事件驱动的JavaScript运行时,旨在构建可扩展的网络应用。”这里不需要介绍nodejs的背景和安装方法,因为nodejs的安装比较简单,在这里重复是浪费时间。

在学习了Node的定义和特点后,很多人可能会好奇这个平台的适用场景是什么,这样才能应用到实际的项目开发中,否则学这个没有意义。主要应用场景:统一的前端编程语言环境;实时应用的高性能输入输出;并行I/O使用户能够更高效地使用分布式环境;并行I/O有效利用稳定的接口提高Web渲染能力;云平台的支持;游戏开发(这可能是很多开发者关心的问题,毕竟目前的游戏开发已经到了无法依附的地步);工具和更多工具的应用大大提高了开发效率。

NodeJS异步I/O模型的基本元素是事件循环、观察器、请求对象和I/O线程池。接下来,让我们了解更多这方面的知识。

二.异步输入/输出解析:

很多人都很熟悉Nginx服务器。Nginx用纯c编写,作为Web服务器使用,在反向代理和负载均衡服务方面有很好的优势。Node和Nginx服务器有相似之处,都是事件驱动的。

在浏览器中,JavaScript在单个线程上执行,它还与UI呈现共享同一个线程。当执行JavaScript时,UI呈现和响应应该脱离停滞状态。(如果脚本执行时间超过100毫秒,用户会觉得页面卡住了。).在这些情况下,我们将考虑异步方法来消除这些等待问题,并且我们将不引入异步和同步的概念。

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

1.输入输出操作概述:

输入输出操作对任何开发人员来说都不陌生。现在让我们简单地谈谈NodeJS的I/o操作。I/O操作分为:单线程串行执行;多线程并行执行。这两种方法各有利弊。多线程的代价在于执行过程中线程创建和线程上下文切换的高成本,多线程面临锁和状态同步的问题。单线程安装是按顺序执行的,其中任何一个执行速度慢,都会导致后续执行代码被阻塞。任务的串行执行(在概念上类似于同步执行)和任务的并行执行描述如下:

NodeJS中使用单线程来避免死锁和状态同步,使用异步I/O来让单线程远离阻塞,从而更好地利用CPU。异步I/O指的是期望I/O调用不再阻塞后续操作,将I/O完成的原始等待时间分配给其他需要执行的服务。

很多时候,一些开发人员对异步/同步和阻塞/非阻塞的概念感到困惑,它们之间没有相关性。阻塞I/O意味着调用后,必须等到系统内核级完成所有操作后,调用才结束。调用后立即返回非阻塞输入/输出。阻塞输入输出和非阻塞输入输出见下图:

2.异步输入/输出解析:

事件循环:当进程开始时,Node将创建一个类似while(true)的循环。每次执行循环体的过程叫做Tick,每次Tick的过程就是检查是否有时间需要处理。

观察者:每个时间周期有一个或多个观察者。判断是否有需要处理的事件的过程就是问这些观察者是否有需要再次处理的事件。

请求对象:在从JavaScript调用到内核执行I/O操作的过渡过程中,有一个中间产物,即请求对象。

I/O线程池:组装请求,发送到I/O线程池执行,完成第一次I/O操作,进入第二次回调通知。(在Windows中,调用线程池中的I/O操作后,得到的结果将存储在req-result属性中,然后调用PostQueuedCompletionStatus()通知IOCP当前对象操作已经完成。)

异步输入/输出如下:

Iii .NodeJS异步编程示例:

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

var config=require('。/config . JSON’);var fs=require(' fs ');var http=require(' http ');var URL _ module=require(' URL ');http.createServer(函数(请求,响应){ var key=URL _ module . parse(request . URL). query . replace(' key=',' ');switch(request . method){ case ' GET ' ://异步响应生成fs.readFile(config.dataPath键,' utf8 ',函数(err,值){ if (err) { //如果文件尚未创建,则返回File Not Found Response . write head(404,{ ' Content-Type ' : ' text/plain ' });response.end('文件(' config.dataPath键')尚不存在);} else { //如果文件存在,读取它并返回排序的内容var sorted=value . split(config . sortslitstring)。排序()。join(' ');response.writeHead(200,{ ' Content-Type ' : ' text/plain ' });response.end(已排序);} });打破;案例“POST”://同步将已发布的数据追加到文件var POSt data=“”;请求。on('data ',function(data){ PostDATa=data;}) .on('end ',function(){ fs . append file(config . data path键,postData,function(err) { if (err) { //如果无法创建/追加到文件响应,则返回错误. writeHead(400,{ ' Content-Type ' : ' text/plain ' });response.end('Error:无法写入文件: ' err);} else { //将发布的数据写入或追加到文件中,返回“成功”响应响应. writeHead(200,{“Content-Type”:“text/plain”});response.end('成功');} });});打破;default : response . write head(400,{ ' Content-Type ' : ' text/plain ' });response.end('Error:错误的HTTP方法: ' request . method);}}).侦听(config . serverport);console.log('同步服务器正在运行: ',config . serverport);四.总结:

这篇博文是我第一次尝试NodeJS的一个小总结。如果写得不好,希望大家多多包容指正。对于程序员来说,他们需要做的就是不断学习,不管是不是他们主要从事的语言。学习多种语言可以帮助我们理解编程。对于一个开发者来说,最终的目标是思考。由于语言的特点和框架的应用,对于一个熟练的程序员来说,学习起来并不难。难点在于我们对语言和框架设计概念的理解。

更多资讯
游戏推荐
更多+