JavaScript和单线程

use*_*672 5 javascript multithreading

我总是听说JavaScript是单线程的; 当执行JavaScript时,它们都在同一个全局mosh坑中运行,所有这些都在一个线程中.

虽然这可能是真的,那个单一的执行线程可能会产生新的线程,异步请求数据回主线程,对吗?例如,当发送XMLHttpRequest时,浏览器是否创建了执行HTTP事务的新线程,然后在XMLHttpRequest返回时在主线程中调用回调?

那么计时器--setTimeout和setInterval呢?这些如何运作?

这种单线程是语言的结果吗?是什么阻止了JavaScript在新的Web Workers草案之前进行多线程执行?

Dan*_*man 6

XMLHttpRequest值得注意的是,它不会阻止当前线程.但是,任何规范中都没有概述其在运行时内的细节.它可以在单独的线程中运行,也可以在当前线程中运行,利用非阻塞I/O.

setTimeoutsetInterval设置定时器,当运行到零时,将执行项(或函数/回调的代码行)添加到执行堆栈,如果代码执行已停止,则启动JavaScript引擎.换句话说,它们告诉JavaScript引擎在完成当前正在执行的任何操作之后执行某些操作.要查看此操作,请setTimeout在一个方法中设置多个并调用它.


jfr*_*d00 3

请参阅这篇文章,了解 javascript 事件队列如何工作的描述,包括它与 ajax 调用的关系。

浏览器当然至少使用一个本机操作系统线程/进程来处理操作系统的实际接口,以检索系统事件(鼠标、键盘、计时器、网络事件等)。是否存在多个本机操作系统级线程取决于浏览器实现,与 Javascript 行为并不真正相关。来自外界的所有事件都会经过 javascript 事件队列,并且直到上一个 javascript 线程执行完毕之后才会处理任何事件,然后从队列中提取下一个事件并提供给 javascript 引擎。