gpt4 book ai didi

javascript - 当 JavaScript 是单线程语言时,如何在 JavaScript 中使用异步非阻塞代码?

转载 作者:行者123 更新时间:2023-11-29 17:37:15 26 4
gpt4 key购买 nike

我是 JavaScript 的新手,我习惯于通过创建工作线程在 Java 中创建异步非阻塞代码。

鉴于 JavaScript 是单线程语言,我不明白异步非阻塞代码在 JavaScript 中是如何工作的。

例如,JavaScript 中的PromisesCallbacks

两者都不是阻塞的,并且允许主线程继续逐行执行程序的其余部分,并且只有在以后履行 promise 时(例如:数据已准备好)然后 promise.resolve() 或回调被执行。

现在,如果主线程已经继续并忙于做不同的事情,我很难理解哪个线程在准确跟踪 promise 何时完成/准备好或回调准备好执行?

我的逻辑告诉我,作为一个 Java 程序员,必须有一个后台工作线程负责在回调/ promise 准备好执行时通知主线程,这与 JavaScript 是单线程的事实相矛盾,所以我一定是错的。

我希望对这个概念有一个很好的解释。提前致谢!

最佳答案

有两种方法可以使用计算机实现并发行为:

  1. 您同时运行两台计算机(或处理器)(多线程)。

  2. 您可以非常快速地在不同任务之间切换,因此它们看起来就像是同时运行(多任务处理)。

现在,Java 经常在这些任务之间切换,而 JavaScript 只会在当前任务完成时切换任务;因此,代码不会并发运行,而是“单线程”运行。

JavaScript 以“单线程方式”执行并不意味着底层引擎是单线程的。它不是,它使用一些线程来管理 I/O。每当您启动一个异步操作时,引擎都会将其委托(delegate)给一个后台线程;然后,当任务完成时,另一个线程将结果返回给主线程,主线程随后将回调到 JavaScript 代码中。

您可以将 JavaScript 引擎视为一个 TaskExecutor,它在 ThreadPool 中启动线程。但是,您只能控制 TaskExecutor

关于javascript - 当 JavaScript 是单线程语言时,如何在 JavaScript 中使用异步非阻塞代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55463927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com