事件循环、回调队列和Javascript’;什么是单线程连接? 总目标
我想知道javascript环境的以下部分如何作为一个系统互连事件循环、回调队列和Javascript’;什么是单线程连接? 总目标,javascript,asynchronous,event-loop,single-threaded,event-queue,Javascript,Asynchronous,Event Loop,Single Threaded,Event Queue,我想知道javascript环境的以下部分如何作为一个系统互连 Javascript引擎 事件循环 事件队列 我们可以将此限制为浏览器环境,因为另一篇文章() 我(相信)理解的事情: Javascript是单线程的,因此只有一个调用堆栈 Javascript环境只提供少数真正异步的函数。这些可能包括setTimeout()、setInterval()和I/O函数 如果不使用其中一个函数,开发人员无法创建自己的异步函数 Javascript本身是同步运行的,但一旦清除当前调用堆栈,通过它的异
- Javascript引擎
- 事件循环
- 事件队列
- Javascript是单线程的,因此只有一个调用堆栈
- Javascript环境只提供少数真正异步的函数。这些可能包括setTimeout()、setInterval()和I/O函数
- 如果不使用其中一个函数,开发人员无法创建自己的异步函数李>
- Javascript本身是同步运行的,但一旦清除当前调用堆栈,通过它的异步函数可以回调可能的阻塞函数李>
- 正在阻止此新线程,对吗
- 如果您有一个创建1000个设置超时的循环,会发生什么。是否创建了1000个“线程”
- 一次可以生成多少线程有限制吗
- 当新线程完成执行时,它如何在队列中结束
- 事件循环是否轮询事件队列
- javascript的线程是否知道事件循环?或者事件循环只是把东西推到堆栈上
- 事件循环如何知道堆栈何时清除
您的理解和示例似乎基本正确。现在,请回答您的问题: 在步骤3中,谁生成了这个新线程?是浏览器吗 对。它基本上是为那些“真正的异步”函数提供实现的东西。IIRC,
setTimeout
直接在JS引擎中实现,而网络IO肯定是浏览器的责任——但谁创建它们并不重要。最后,在“浏览器环境”中,它始终是浏览器的一部分
正在阻止此新线程,对吗
对。否。这取决于需要完成的工作,即调用哪个异步函数。有些可能需要旋转一个新线程,但对于简单的超时,我非常确定使用了非阻塞系统调用
如果您有一个创建1000个设置超时的循环,会发生什么。是否创建了1000个“线程”
可能。不过不太可能。我假设对于那些真正需要自己的线程的异步操作,会使用线程池,并且请求会排队。此池的大小可能隐藏在浏览器配置的内部
一次可以生成多少线程有限制吗
这将由操作系统控制
当新线程完成执行时,它如何在队列中结束?谁提供事件队列
基本上,每个此类线程的最后一个操作是将其结果放入事件队列中
谁提供事件循环?事件循环是否轮询事件队列
我认为这是一个实现细节,无论循环轮询队列还是队列驱动循环迭代
javascript的线程是否知道事件循环?或者事件循环只是把东西推到堆栈上
我认为javascript在事件循环线程中运行。事件循环只是重复地从队列中弹出事件并执行它们的javascript
事件循环如何知道堆栈何时清除
事件循环调用javascript执行-因此当javascript返回时堆栈是清晰的。我花了一段时间才意识到这些都是我问题的好答案。我觉得一些关于浏览器如何处理JS引擎的漂亮图片会让社区受益匪浅。Phillip Roberts关于事件循环的演讲在许多方面也提供了丰富的信息。您好,我有一个关于原始帖子中异步部分“开发人员无法创建自己的异步函数”的问题,如果您能看一看,将不胜感激:@mzoz是的,+Bergi非常感谢您,并祝您圣诞快乐!MDN有一篇文章叫做
console.log(‘Sync code started…’);
setTimeout(function asyncLog() {
console.log(‘Async function has completed’)
}, 2000);
console.log(‘Sync code finished…')