原创

异步I/O

异步I/O

为什么要异步 I/O

在跨网络的结构下,并发已经是现代编程中的标准配备了

在浏览器中 JavaScript 执行与 UI 渲染共用一个线程

前端通过异步可以消除掉UI阻塞的现象

采用异步并发下载资源

多线程的代价在于创建 线程和执行期线程上下文切换的开销较大

但是串行执行的缺点在于性能

Node在两者之间给出了它的方案

利用单线程,远离多线程死锁、状态同步等问题

利用异 步I/O,让单线程远离阻塞,以更好地使用CPU

异步 I/O 实现现状

非阻塞I/O跟阻塞I/O的差别为调用之后会立即返回

阻塞I/O造成CPU等待浪费

非阻塞带来的麻烦却是需要轮询去确 认是否完全完成数据获取

read

select

poll

epoll

kqueue

Node 的异步 I/O

事件循环

在进程启动时,Node便会创建事件循环,循环执行事件关联的回调

观察者

每个事件循环中有一个或者多个观察者,观察者决定是否要执行事件

请求对象

从JavaScript发起调用到内核执行完I/O操作的 过渡过程中的中间对象

执行回调

组装好请求对象、送入I/O线程池等待执行,实际上完成了异步I/O的第一部分,回调通知是 第二部分。

非 I/O 的异步 API

定时器

实现原理与异步I/O比较类似,只是不需要I/O线程池的参与

定时器的问题在于,它并非精确的

process.nextTick()

setTimeout(fn, 0) 的 方式较为 浪费性能。 实际上, process.nextTick()方法的操作相对较为轻量

每次调用process.nextTick()方法,只会将回调函数放入队列中,在下一轮Tick时取出执行

setImmediate

process.nextTick()中的回调函数执行的优先级要高于setImmediate()

原因在于事件循环对观察者的检查是有先后顺序的

事件驱动与高性能服务器

事件驱动的实质,即 通过主循环加事件触发的方式来运行程序

事件循环是异步实现的核心,它 与浏览器中的执行模型基本保持了一致

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在Google I / O 2018上观看Flutter

    距离Google I / O 2018仅仅一周之遥,Flutter将在活动中展示风格,包括会话,代码,办公时间,交互式沙箱空间等等。

    flyou
  • golang fmt(格式换 I O接口)

    fmt 方法可以大致分为 print, scan两类, 根据基础方法可以构建特定方法。

    copy_left
  • java的IO技术中什么是I什么是O?

    马克-to-win:很多老司机还搞不清什么是I什么是O。很简单,我有个土办法。以内存为单位,数据进内存叫In,出内存叫Out。读文件,是数据从硬盘进到内存,所以...

    马克java社区
  • 同步异步

    同步和异步关注点为消息通信机制 (synchronous communication/ asynchronous communication)

    见贤思齊
  • 分布式机器学习I / O的透视式预取

    I / O正在成为机器学习培训的主要瓶颈,尤其是在云和超级计算机等分布式环境中。 最佳的数据提取管道在系统之间有所不同,提高效率需要在对本地存储,外部文件系统和...

    YH
  • springBoot异步任务、异步监控

    除了自己实现线程外,springBoot本身就提供了通过注解的方式,进行异步任务的执行。下面主要记录一下,在springBoot项目中实现异步任务,以及...

    xcbeyond
  • Go并发之同步异步、异步回调

    众所周知,Go语言最强大的地方在于它支持的高并发特性。下面我们先来了解一下Go并发的一些理论基础:同步异步、异步回调。也顺带在此介绍一下进程、线程、协程的区别。

    Regan Yue
  • RNA-seq 检测变异之 GATK 最佳实践流程

    RNA-seq 序列比对 对 RNA-seq 产出的数据进行变异检测分析,与常规重测序的主要区别就在序列比对这一步,因为 RNA-seq 的数据是来自转录本的,...

    生信技能树
  • 教你做一个异步的fis3插件

    从fis的官方文档上看,fis 除了deploy 插件是支持异步的其它都不支持。但是有好多node包 都是异步,怎么才能让fis支持异步插件呢?

    IMWeb前端团队
  • C++核心准则​SL.io.3:优先使用iostream进行I / O

    iostreams are safe, flexible, and extensible.

    面向对象思考
  • 多线程系列(三)之线程池

    .NetFramework1.0时代的Thread,API功能繁多,对线程的数量是没有管控的,在.NetFramework2.0时代推出了ThreadPool,...

    指尖改变世界
  • 教你做一个异步的fis3插件

    本文作者:IMWeb 黄龙 原文出处:IMWeb社区 未经同意,禁止转载 不清楚fis3是什么的可以先看这个链接 http://fis.baidu.c...

    IMWeb前端团队
  • 第三方Javascript开发系列之投放代码

    本文先从第三方Javascript脚本的重要组成部分“投放代码”讲起。先从一个最例子看起:Google Analytics(以下简称GA),是Google提供的...

    mmzhou
  • RNA-seq数据分析完全指北-10:gatk找突变

    如果有读者仔细看过RNA-seq结题报告,就会发现在定量分析以外通常还会有SNP和INDEL分析。目前,对人类测序数据找突变最常用的软件是GATK,除了速度慢以...

    生信菜鸟团
  • 如履薄冰 —— Redis懒惰删除的巨大牺牲

    之前我们介绍了Redis懒惰删除的特性,它是使用异步线程对已经删除的节点进行延后内存回收。但是还不够深入,所以本节我们要对异步线程逻辑处理的细节进行分析,看看A...

    老钱
  • Dart 异步

    一条执行线上,同时且只能执行一个任务(事件),其他任务都必须在后面排队等待被执行。也就是说,在一条执行线上,为了不阻碍代码的执行,每遇到的耗时任务都会被挂起放入...

    Hankkin
  • 异步FIFO

    如上图所示的同步模块synchronize to write clk,其作用是把读时钟域的指针rptr采集到写时钟wr_clk域,然后和写时针wptr进行比较从...

    数字芯片社区
  • JavaScript异步

    这是一个异步编程的代码,刚开始的时候我一直绕不出来,何为异步?我想到了ajax的异步,但是还是没明白,查了很多讲解,越看越不明白,最后找到了任务队列和主线程,才...

    wade
  • 异步(async)

    Task用于并发调度协程,通过asyncio.create_task()的方式创建Task对象,我们可以添加多个任务在其中,当遇到io阻塞时,会去调用其他的任务...

    用户8442333

扫码关注云+社区

领取腾讯云代金券