异步I/O(一)

最后更新于:2022-04-02 05:32:02

## 前言 在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.
';