JS如何既非阻塞/异步又是单线程的?

时间:2015-07-23 07:08:50

标签: javascript asynchronous concurrency conceptual

我无法直观地了解Javascript如何在客户端上进行单线程但无阻塞。我一直设想像装配线一样:

  • 在代码执行开始时,您已经有一条装配线将不同的部件放在一起。

  • 我们达到了需要添加引擎的20%到完成点,但尚未组装引擎。

  • 而不是等待发动机组装,装配线被分解成两条装配线 - 两条线,对吗?

  • 第1行继续组装汽车的其他部分。

  • 第2行开始组装引擎。

  • 当第2行完成发动机装配后,它会返回第1行并添加引擎。

  • 此时,第1行可以达到30%完成,99%完成等,具体取决于发动机组装的速度。

这就是我设想的非阻塞异步代码的方法。第1行的主要线程继续突然,而不必等待第2行完成。但是这个装配线比喻需要两个装配线,或两个线程,但JS是单线程的。

所以现在我很困惑。

2 个答案:

答案 0 :(得分:5)

简而言之,运行时有一个事件循环,它有点模拟一个线程中的异步。 不久,我发现这个视频和文字是一个很好的解释: http://2014.jsconf.eu/speakers/philip-roberts-what-the-heck-is-the-event-loop-anyway.html

答案 1 :(得分:1)

不,线程不是装配线。保守你的比喻:

  • 装配线是需要对您的汽车进行的事物序列(或线路正在生产的任何东西)
  • 一个线程就像一个正在处理这些装配线的工人

是的,在单线程环境(单人工厂)中,工人一次只能在一条装配线上工作。但这并不意味着装配线不能同时运行 。工人可以启动一台油漆车的机器,然后转到另一条线并安装一部分电机,然后回到现在涂漆的汽车并开始干燥......

这就是JS的工作原理。工人在完成下一个任务之前必须完成当前步骤,但随后他可以选择另一条装配线,因为他认为它适合。这甚至允许并行处理,当他需要做的就是启动一台在后台工作的机器,因为他可以在等待机器完成的信号时做其他事情。