我正在阅读“Eloquent Javascript”,第 11 章异步编程,第 181 页给出了一张图表,对比了发送两个网络请求的情况下单线程、多线程和异步技术的差异。黑点代表时间线中提出请求的点。细线表示等待响应所花费的时间。粗线代表正常的程序执行。我的疑问是时间线上的差距。作者没有提到它们代表什么,所以我很难在概念上做出精确的区分。感谢您对理解的任何帮助。
异步模型允许同时发生多件事。当你开始一个动作时,你的程序会继续运行。当操作完成时,程序会收到通知并可以访问结果(例如,从磁盘读取的数据)。
我们可以用一个小例子来比较同步和异步编程:一个从网络中获取两个资源然后组合结果的程序。
在同步环境中,请求函数仅在完成其工作后才返回,执行此任务的最简单方法是一个接一个地发出请求。这样做的缺点是只有在第一个请求完成后才会启动第二个请求。花费的总时间将至少是两个响应时间的总和。
在同步系统中,这个问题的解决方案是启动额外的控制线程。线程是另一个正在运行的程序,其执行可能会被操作系统与其他程序交错执行——因为大多数现代计算机都包含多个处理器,因此多个线程甚至可以同时在不同的处理器上运行。第二个线程可以启动第二个请求,然后两个线程都等待它们的结果返回,然后它们重新同步以组合它们的结果。
在下图中,粗线表示程序正常运行所花费的时间,细线表示等待网络所花费的时间。在同步模型中,网络所花费的时间是给定控制线程时间线的一部分。在异步模型中,开始一个网络动作在概念上会导致时间线的分裂。启动动作的程序继续运行,动作随之发生,完成时通知程序。