异步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.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章