异步IO(一)

前言

在web2.0的时候,其实前端就很熟悉异步编程了,只不过那时大家使用的是ajax(典型的网络请求)实现的,还有一些前端的事件机制(针对事件定义回调事件)。

但是在传统的高级编程中,异步编程很少被使用,因为大部分程序员不习惯异步编程来进行程序设计。而node是首个将异步作为主要编程方式和设计理念的编程语言。

与node事件驱动、异步io设计理念相近的是nginx,它具备向客户端管理连接的巨大能力,但是其底层还是受制于各种同步的编程方式。而node是全方面的,既可以作为服务端去处理客户端带来的大量并发请求,也能作为客户端去向网络中的各个应用进行并发请求。

为什么要异步

用户体验

最早的浏览器中js是单线程的,获取一个网络资源需要同步获取,如果有两个请求,时间消耗分别为M,N,那么同步请求的时间则为两者之和;而如果是异步,则是取较大者;另外一个明显的区别就是同步会阻塞ui渲染,而异步不会。

在大时代背景下,越来越多的微服务是分布的,而随着服务的增多这部分开销会线型增长,也意味着放大同步和异步的性能差异。在下面的表格中,我们列举了一些从cpu缓存到网络的数据访问所需要的开销作为对比。

io类型 花费时间周期
cpu一级缓存 3
cpu二级缓存 14
内存 250
硬盘 41000000
网络 240000000

资源分配

场景:如果有若干不相干的任务需要完成,主要有两种方式:
1 单线程顺序执行
2 多线程并发完成

分析:针对两种的优缺点进行简要分析

实现方式 优点 缺点 其他
单线程顺序执行 符合编程思维 性能不好,任何一个任务慢会导致其他阻塞,在计算机中,io和cpu计算可以并行进行的,但同步编程中的io会让其他任务阻塞
多线程并发 更好的利用cpu 面临锁、状态同步的问题 前提是创建线程的开销远小于并行任务

为了弥补单线程无法利用多核cpu的缺点,node提供了类似web worker的子进程,子进程通过工作进程高效的利用cpu和io.

发布者

Robinson Zhang

热爱前端,热爱分享,坚持高频写作,从小白到大师只是时间问题。