【问题标题】:What do the gaps mean in the diagram given in page 181, chapter 11: Asynchronous programming in the book Eloquent Javascript?Eloquent Javascript 一书中第 181 页第 11 章:异步编程中给出的图表中的差距是什么意思?
【发布时间】:2021-05-02 12:04:11
【问题描述】:

我正在阅读“Eloquent Javascript”,第 11 章异步编程,第 181 页给出了一张图表,对比了发送两个网络请求的情况下单线程、多线程和异步技术的差异。黑点代表时间线中提出请求的点。细线表示等待响应所花费的时间。粗线代表正常的程序执行。我的疑问是时间线上的差距。作者没有提到它们代表什么,所以我很难在概念上做出精确的区分。任何理解方面的帮助表示赞赏。

异步模型允许同时发生多件事。 当你开始一个动作时,你的程序会继续运行。当动作 完成后,程序会收到通知并可以访问结果(例如, 从磁盘读取的数据)。
我们可以使用一个小的比较同步和异步编程 示例:一个程序从网络中获取两个资源,然后 结合结果。
在同步环境中,请求函数仅在 它已经完成了它的工作,执行此任务的最简单方法是发出请求 一个接一个地。这样做的缺点是第二个请求将是 只有在第一个完成时才开始。花费的总时间至少为 两个响应时间的总和。
在同步系统中,这个问题的解决方案是启动额外的 控制线程。线程是另一个正在运行的程序,其执行可能 由操作系统与其他程序交错——由于大多数现代计算机包含多个处理器,因此多个线程甚至可以运行在 同时,在不同的处理器上。第二个线程可以启动第二个 请求,然后两个线程都等待它们的结果返回,之后 他们重新同步以组合他们的结果。
在下图中,粗线表示程序花费的时间 正常运行,细线表示等待网络所花费的时间 工作。在同步模型中,网络所花费的时间是 给定控制线程的时间线。在异步模型中,启动一个 网络动作在概念上会导致时间线的分裂。该程序 启动动作继续运行,动作发生在它旁边, 完成时通知程序。

【问题讨论】:

    标签: javascript multithreading asynchronous asynchronous-javascript


    【解决方案1】:

    我会说这些差距代表将控制权交还给更高的实例。对于 JavaScript,这个更高的实例将是浏览器,然后它会使用中间的时间来呈现页面或执行其他任务。对于通用进程,更高的实例将是操作系统,它将调度另一个进程的执行,或者如果不存在其他进程,则在物理上关闭处理器一小段时间。

    【讨论】:

    • 好的,但是间隙和细线之间有什么区别?等待进程是否仍在运行?
    • 可能是,那叫busy waiting。在 JS 的上下文中,情况可能并非如此,像 NodeJS readFileSync 这样的“阻塞调用”可能也会让引擎/操作系统执行其他任务,但它会阻止其他 JS 任务运行。所以当任务没有主动执行时,它仍然在阻塞执行。
    猜你喜欢
    • 2021-04-11
    • 2021-09-10
    • 1970-01-01
    • 2011-03-24
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多