Learning to be Giant.

Javascript的Event Loop

|

今天在读Node的书的时候才知道Javascript竟然是一个单线程的语言,但是作为以异步见长的一门技术,如果浏览器端和Node都是单线程执行的话究竟是如何实现的异步呢?这十分的令人费解。另外还有一堆奇怪的概念包括Event Loop,这个在很多其他的编程语言当中不常见,类似的我只在Cocoa当中见过NSRunLoop。索性今天找到了这一个2014年JSConfEU的视频,讲解的比较清楚:

TL;DW: 事实上我们关心的问题主要集中以下几个:

  1. Javascript确实是一门单线程的语言,但是在语言之外浏览器/Node还提供了各种API,这些API并不是单线程的,这些API实现了包括延迟的功能;
  2. Event Loop其实就是一个不断询问Task Queue(是一个独立的Queue,里面保存了需要延迟执行的一些指令)当中有没有新任务的东西
  3. 所谓的非阻塞其实就是将一个比较费时间的工作放到了由浏览器/Node提供的API当中去执行,执行之后会调用一个callback在主线程(也是唯一线程),而这个所谓的调用其实就是在执行完成之后在Task Queue当中增加一条要执行的指令。当程序的Call Stack清空之后执行Task Queue当中的代码。

Disclaimer: This is a personal weblog. The opinions expressed here represent my own and not those of any entity with which I have been, am now, or will be affiliated.

Comments