Skip to content

Latest commit

 

History

History
18 lines (10 loc) · 2.68 KB

node异步IO.md

File metadata and controls

18 lines (10 loc) · 2.68 KB

node异步I/O

将异步作为主要编程方式和设计理念的,Node是首个。Node是全方位的,既可以作为服务器端去处理客户端带来的大量并发请求,也能作为客户端向网络中的各个应用进行并发请求,如electron。

异步I/O为什么在node中盛行?

  1. 用户体验,首先是在浏览器端火起来的,浏览器中JavaScript在单线程上执行,而且它还与UI渲染共用一个线程。这意味着JavaScript在执行的时候UI渲染和响应是处于停滞状态的。同理在后端,响应前端资源的速度取决于服务器,硬盘读取和网络请求的开销是巨大的,尤其是在数据分配在多台服务器上时,这种影响会更明显,这就是异步I/O在Node中如此盛行,甚至将其作为主要理念进行设计的原因。I/O是昂贵的,分布式I/O是更昂贵的。
  2. 资源分配,如果创建多线程的开销小于并行执行,那么多线程的方式是首选的。多线程的代价在于创建线程和执行期线程上下文切换的开销较大。另外,在复杂的业务中,多线程编程经常面临锁、状态同步等问题,这是多线程被诟病的主要原因。但是多线程在多核CPU上能够有效提升CPU的利用率,这个优势是毋庸置疑的。单线程同步编程模型会因阻塞I/O导致硬件资源得不到更优的使用。多线程编程模型也因为编程中的死锁、状态同步等问题让开发人员头疼。Node在两者之间给出了它的方案:利用单线程,远离多线程死锁、状态同步等问题;利用异步I/O,让单线程远离阻塞,以更好地使用CPU。

node力求在单线程上将资源分配得更高效。为了弥补单线程无法利用多核CPU的缺点,Node提供了类似前端浏览器中Web Workers的子进程,该子进程可以通过工作进程高效地利用CPU和I/O。

一个需要强调的地方在于我们时常提到Node是单线程的,这里的单线程仅仅只是JavaScript执行在单线程中罢了。在Node中,无论是*nix还是Windows平台,内部完成I/O任务的另有线程池。

Node如何实现异步I/O?

node完成整个异步I/O环节的有事件循环、观察者和请求对象等。

总结,事件循环是异步实现的核心,它与浏览器中的执行模型基本保持了一致。而像古老的Rhino,尽管是较早就能在服务器端运行的JavaScript运行时,但是执行模型并不像浏览器采用事件驱动,而是像其他语言一般采用同步I/O作为主要模型,这造成它在性能上无所发挥。Node正是依靠构建了一套完善的高性能异步I/O框架,打破了JavaScript在服务器端止步不前的局面。