【问题标题】:how are network requests handled in an async manner when the browser javascript engine is single-threaded [duplicate]当浏览器javascript引擎是单线程时,如何以异步方式处理网络请求[重复]
【发布时间】:2013-08-22 22:39:03
【问题描述】:

我的背景主要是作为服务器开发人员和经理,但我必须进入并从事前端和 iOS 开发人员的工作。我问这个问题不是争论,但我真的不明白 Javascript 在网络请求方面的单线程性质是什么意思。

我了解事件如何在用户空间级别在 Javascript 和 iOS 中注册。我的问题是,如果网络请求未放在后台线程上,iOS 中的 UI 将阻塞。但是,在浏览器/javascript 运行时中,它不会。 Javascript(至少是当前的实现/pre-web-workers)总是被描述为单线程的。我理解(我认为 - 但这可能是问题)setInterval 用于检查完成的方式,但是单线程 Javascript 运行时如何具有不阻塞 UI 的异步函数(尤其是考虑到 iOS 没有它)?例如,在这个答案中,似乎需要创建 5 个线程:Parallel asynchronous Ajax requests using jQuery

事实上,一次可以有 6 个出站网络请求。当 javascript 运行时被描述为单线程时,这是否意味着与 iOS 的多线程概念(或者更准确地说是 POSIX 的带有 pthread_create 处理套接字描述符的 while 循环的概念)根本不同。

我可能只是没有得到任何东西,但我认为提供的大多数示例都没有说明在单线程环境中实际上是如何完成的(除非在操作系统级别而不是 Javascript 运行时考虑网络请求等级)

感谢您对此的任何帮助

【问题讨论】:

  • 我不认为这是该问题的重复,特别是当 Javascript 运行时被称为单线程与 POSIX 或 iOS 时,线程意味着不同的东西。似乎网络请求被视为操作系统的一部分,而不是像 iOS 和 POSIX 中的用户空间。

标签: javascript jquery design-patterns asynchronous


【解决方案1】:

在 Web 应用程序的编程模型中,不会抢先执行以允许另一个线程运行。你的 webapp 的一个线程运行直到它产生,要么返回它的源,要么发出一个 i/o 请求。假设你有一个点击监听器——它不会中断你的应用程序中运行的其他代码;浏览器在它前面的所有事件都运行完成后运行它。在浏览器应用程序中,您不需要序列化对数据的访问,因为在任何给定时间只有一个堆栈处于活动状态。嗯。

【讨论】:

    【解决方案2】:

    考虑阅读此 SO:How does non blocking IO work in javascript

    它提到的是 javascript 是基于事件循环的,这意味着当您构建异步 http-request 时。它将执行 ajax 调用,注册一个事件侦听器(执行回调方法),然后继续完成它排队的其余工作。 当响应返回时,侦听器将触发您注册的回调方法。

    【讨论】:

    • 感谢响应,但 node.js 肯定会在库中创建线程,即使主应用程序是单线程的。我有点假设这是浏览器模型 - 我很惊讶大多数资源/文档不只是这么说。
    • @timpone "node.js 肯定会在库中创建线程" - 你有什么实际理由这么说吗? Node 本身确实创建了额外的线程(嗯,v8 确实 - 对它们进行了 javascript 解析和优化)。但是,我认为没有任何节点库会默默地创建新线程。
    • 主事件循环当然是单线程的,但它会创建一个工作线程池。在此处查看答案:stackoverflow.com/questions/10680601/nodejs-event-loop 这就是为什么我在 pthread_create 或 iOS 块周围询问将在原始问题中创建新线程的原因。
    猜你喜欢
    • 2013-02-04
    • 1970-01-01
    • 1970-01-01
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 2012-02-27
    相关资源
    最近更新 更多