js map获取_感知 Node.js 异步I/O 的魅力!

JS 在浏览器的网页中执行,浏览器给 JS 提供的能力是操作文字、图片,或实现一些简单效果。术语叫 DOM 操作。

JS 在 Node.js 环境中执行,  Node 给 JS 提供了诸如 文件操作, 网络操作 等功能模块。基于这些模块,JS 一下就牛气冲天了。

在 Node.js 的加持下,JS 可以写服务器程序了,可以写大量实用工具了。进而推动了今天前端领域的蓬勃发展。

JS 语法还是那个语法,平台不同,则产生了不同的效果。 

人也一样,平台很重要。

Node 环境下 JS 到底有啥不同?

典型的说法: 异步I/O、单线程、事件驱动。本次我们就通过『异步I/O』领略 Node.js 的优秀之处。

比如统计一个目录中文件大小总和,过程中要获取每一个文件的大小信息,这就牵扯到非常典型的磁盘I/O操作。

同步I/O操作,是读取完一个文件信息,得到大小后, 再读取下一个文件。(它们的关系是阻塞的)

异步I/O操作,读取第一个文件时,不等信息返回,就发送读取第二个文件信息的指令。整个目录中文件信息的获取时间是非线性的。(或者说, 读取文件大小这些小任务之间是『非阻塞』的)

让我们通过代码体会一下 JS 异步执行的这个『种族天赋』

JS同步版本:

const fs = require("fs")function dirSizeSync(dir) {  // 1.获取目录中所有文件名  let files = fs.readdirSync(dir)  // 2.求每个文件大小,加到总和上, 最后返回  return files.reduce((totalSize, file) => {    return totalSize + fs.statSync(`${dir}/${file}`).size  }, 0)}// 测试. 统计 code 目录console.log(dirSizeSync("./code"))

JS异步版本:

const fs = require("fs").promises // 采用promise风格APIasync function dirSizeAsync(dir) {  // 1.读取目录中所有文件  let files = await fs.readdir(dir)  // 2.异步得到所有文件的相关信息, 返回的是一组promise  let arrPromiseStat = files.map((file) => fs.stat(`${dir}/${file}`))  // 3.等所有promise都完成后,返回一个结果数组  let stats = await Promise.all(arrPromiseStat)  // 4.对结果数组求和,并返回  return stats.reduce((total, stat) => total + stat.size, 0)}// 测试. 统计 ./code 目录dirSizeAsync("./code").then((total) => {  console.log(total)})

为了把问题说清楚,代码少了些骚气。而且好像异步版本代码量更大。那么我们还是拉出来跑一跑吧。先来个测试代码:

// 统计同步版本用时console.time("同步")console.log(dirSizeSync("./code"))console.timeEnd("同步")// 统计异步版本用时console.time("异步")dirSizeAsync("./code").then((totalSize) => {  console.log(totalSize)  console.timeEnd("异步")})

来看一下结果:

da7efdb04af3b2a939d1dfd5ead8b58d.png

随着业务量增大,差距会更大。异步I/O的实现依赖于事件驱动,它使得一个线程能够被充分利用。

多线程中处理任务经常要考虑复杂的线程同步问题,所以 node 被有意设计为单线程,进而也减少了多线程间切换的开销。

值得说明的是,这并不是说 node 就不可以开启多个线程。这里我们不做展开。也正是这样一次练习让我真正对 node 重视起来,不再把它当成一个玩具。

尊重技术, 尊重读者, 本篇文章知识点:

1. (node + js)  与   (浏览器 + js) 的不同?

2. 什么是阻塞 ?  什么是非阻塞 ?

3. reduce() 方法怎么用?

4. fs.promises API,  Promise.all( ) 的真实应用场景?

5. 尽量结合使用的 async / await ?

6. 如何统计JS代码运行时间? 异步代码的小细节.

7. node 为何单线程? 能不能有多个线程?

8. 异步i/o、事件驱动,、单线程如何统一理解?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498982.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

k8s pod restartcount 改0_通过实例快速掌握k8s(Kubernetes)核心概念

点击上方蓝色“Go语言中文网”关注我们,设个星标,每天学习 Go 语言本文作者:倚天码农,原创授权发布原文链接:https://segmentfault.com/a/1190000020595811容器技术是微服务技术的核心技术之一,并随着微服务…

div垂直居中的方法_【CSS】8种常见的垂直水平居中方法

1.比较传统的方式 absolutemargin负值偏移特点:父容器要设置宽高,需要知道子容器宽高,偏移量是子容器宽高的一半且是负值,兼容性好/* absolutemargin负值偏移布局 */.layout.absolute {position: relative;}.layout.absolute art…

websocket 导致大量apache进程_Swoole 服务端主动向websocket推送消息

在之前的博文中,我们已经学完了如果使用swoole搭建websocket长连接,也学会了swoole的多进程数据共享操作。但在一个完整的websocket长连接日常操作链中,服务端往往会主动给在线的用户单独推送消息,会群发一些消息。在Swoole-webso…

python因子分析法_python——因子分析

因子分析用Python做的一个典型例子 一、实验目的 采用合适的数据分析方法对下面的题进行解答二、实验要求 采用因子分析方法,根据48位应聘者的15项指标得分,选出6名最优秀的应聘者。 三、代码 importpandas aspd importnumpy asnp importmath asmath imp…

polycom安卓手机客户端_三款免费「游戏串流」APP,在手机/电视上玩PC游戏

以前想把电脑游戏输出到电视机上玩,得用HDMI线输出,如果电脑主机和电视机离太远,HDMI线不够长,还得抱电脑主机到电视机旁边,非常不方便。随着技术的发展,现在已经有「串流」功能,只要电视机和电…

python获取返回值_python如何获取函数的返回值

函数需要先定义后调用,函数体中 return 语句的结果就是返回值。如果一个函数没有 reutrn 语句,其实它有一个隐含的 return 语句,返回值是 None,类型也是 NoneType。return 语句的作用:结束函数调用、返回值 指定返回值…

java模拟器百度_Java模拟实现百度文档在线浏览

这个思路是我参考网上而来,代码是我实现。采用Apache下面的OpenOffice将资源文件转化为pdf文件,然后将pdf文件转化为swf文件,用FlexPaper浏览。ok,A、下载OpenOffice (转换资源文件)B、下载JodConverter(调用OpenOffice)C、下载Sw…

body click js 委托_JS 事件循环

进程 线程CPU 分配资源的最小单位是进程,同一个时间内单个 CPU 只能运行一个进程,单个 CPU 一次只能运行一个任务CPU 调度的最小单位是线程,一个进程里面包含多个线程。可以看看阮老师的这篇文章,进程与线程的一个简单解释浏览器的…

django jsonresponse_利用 Django 动态展示 Pyecharts 图表数据的几种方法

本文将介绍如何在 web 框架 Django 中使用可视化工具 Pyecharts, 看完本教程你将掌握几种动态展示可视化数据的方法!Django 模板渲染1. 新建一个 Django 项目命令行中输入以下命令django-admin startproject pyecharts_django_demo创建一个应用程序python manage.py startapp d…

python网页登录验证码不显示_进网页需要验证码?不好意思,Python从来不惧各种验证码!...

今天要来说说滑动验证码了大家应该都很熟悉点击滑块然后移动到图片缺口进行验证现在越来越多的网站使用这样的验证方式为的是增加验证码识别的难度那么,对于这种验证码应该怎么破呢接下来就是见证神奇的时刻打开 b 站的登录页面可以看到登录的时候需要进行滑块验证按…

怎么调用新建模型里文章的内容_优雅地进行Tensorflow Lite模型转换

初涉知乎江湖,知道大佬很多,请温柔以待!!!七日凌晨,谷歌连夜发布了有关于Tensorflow最新成果和技术,这应该是贾扬清离开脸书后另一个深度学习界令人惊呼的事件了吧!(旁白…

git add后取消_Git常用命令-总结

创建git用户$ git config --global user.name "Your Name"$ git config --global user.email "emailexample.com"初始化一个Git仓库,使用git init命令。添加文件到Git仓库,分两步:使用命令git add ,注意&…

查看csv编码_[小O地图-数据] - 坐标转地址文字(逆地理编码)

小O地图是一款基于互联网地图进行地理数据处理、分析、图表的软件。致力为广大科研人员提供专业地图数据,用于科研及学习。小O地图提供将【经纬度坐标转换为地址】的功能,例如:将“116.359861, 39.917225” 转换为 “北京市西城区…

python自动化办公源码_python自动化办公:文件篇(自动整理文件,一键完成)

import os list_all[]#初始化一个空列表 for root ,dirs,files in os.walk(rC:UsersShineionDesktop新建文件夹): for name in files: file_pathos.path.join(root,name)#包含路径的文件 file_nameos.path.split(file_path)[-1] list_all.append(file_name) print(list_all)如果…

ocr中文数据集_CNOCR:测试集准确率最高98%,自带识别模型的中文OCR包

今天 Gitee 为大家介绍的是一款中文 OCR 包。大家都知道,训练模型是一件非常费时费力的事情,但今天这款项目已经自带训练好的识别模型,我们只需要下载下来使用即可,可以说是非常方便了,那么下面我们就去看看这个项目的…

sha算法源代码java_SHA算法Java实现

一 简介安全散列算法固定长度摘要信息二 SHA算法SHA-1、SHA-2(SHA-224、SHA-256、SHA384、SHA-512)三 SHA算法实现package com.imooc.security.sha; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Security; impo…

arraylist remove() java_执行ArrayList的remove(object)方法抛异常?

简介或许有很多小伙伴都尝试过如下的代码:然后会发现抛出java.util.ConcurrentModificationException异常,这是一个并发异常。那么这个到底是什么情况?首先需要介绍一下增强for循环增强for循环增强for循环是Java1.5后,Collection实…

centos gdb调试_gdb-miss-debuginfo

使用gdb调试core时候,提示Missing separate debuginfos的解决办法。错误提示错误提示信息如下:Missing separate debuginfos, use: debuginfo-install glibc-2.17-106.el7_2.8.x86_64 libaio-0.3.109-13.el7.x86_64 libgcc-4.8.5-4.el7.x86_64 libstdc-4…

怎么判断自己启动的线程是否执行完成 java_多线程?怎么用?

Java线程:概念与原理操作系统中线程和进程的概念现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。比如在Windows系统中&…

mysql设置中文_Flask中MySQL预热

Flask和MySQL导读现在Flask已经学习到了类视图,它其实是这样一个关系FLask高级视图视图函数app.route\add_url_rule类视图蓝图blueprint(这个接下来要讲)结束蓝图后,接着就是Flask数据库的结合SQLAlchemy.在学习SQLAlchemy之前,希望和大家一起了解学习一下mysql这篇文章不涉及理…