2016-01-18 64 views
1

它在很多网站上说JavaScript是单线程的。当他们这样说时,他们是否指JavaScript运行时?当他们说JavaScript是单线程时,这意味着什么?

我可能会误解一些东西,但不是JavaScript只是一种编程语言,您使用它创建的程序应该被标记为单线程?但是也许我不理解某些东西,那么有人能解释我没有得到什么吗?

+0

可能重复http://stackoverflow.com/questions/21718774/how-is-javascript-single-threaded –

+0

语言是单线程会更准确我想 - 如果你想的是如何一个像样的说明js有效,这[MDN页面](https://developer.mozilla.org/en/docs/Web/JavaScript/EventLoop)可以完成它的工作 –

+1

@JaromandaX:该语言不是单线程的。这个语言在线程方面几乎没有任何问题,这是一个非常不同的东西。 –

回答

3

JavaScript,语言,几乎没有关于线程的话题。无论是单线程还是多线程都是其运行环境的问题。有单线程JavaScript环境和多线程JavaScript环境。规范所要求的唯一真正的要求是一个线程有一个job queue,并且一旦一个作业(一个运行的代码单元,如一个事件处理程序的调用单元)被启动,它会在该线程上的另一个作业之前运行到完成队列开始。也就是说,JavaScript具有运行至完成语义。

浏览器上的JavaScript 不是单线程并没有多年。有一个主线程(用户界面处理的线程)和任意数量的web worker线程。 Web工作人员无法直接访问UI,他们会将messaegs发送到UI线程,并执行UI更新。线程不直接共享数据,它们通过消息传递显式共享数据。与多线程访问UI和相同的公共数据区域相比,这种分离使编程多线程代码变得更加简单并且不易出错。 (编写正确的多线程代码,任何线程都可以在任何时间访问任何内容)hard。)

在浏览器之外,NodeJS中的JavaScript运行在单个线程上。有一个Node的分支添加了多线程,但我认为它没有去过任何地方。

JVM上的JavaScript(Rhino,Nashorn)一直是多线程的,由JVM的线程设施支持。

1

虽然TJC的答案当然是正确的,但我不认为它解决了当人们说“JavaScript是单线程”时人们实际意义的问题。他们实际上总结(不准确)的是,运行时必须像有单个执行线程那样工作,这不能被预先占用,而且必须运行到完成。只要最终结果以这种方式运行,实际的运行时就可以做任何它喜欢的事情。

这意味着,虽然JavaScript程序可能看起来与大量线程互相交互,但实际上并没有这种类型。内核使用队列,事件循环和运行至完成语义(简要地)描述here来控制一切。

这与硬件描述语言(VHDL,Verilog,SystemC(虽然实际上不是语言)等)面对的问题完全相同。他们通过在'进程'之间运行一个不可抢占的运行时内核循环,并且必须运行到定义的暂停点之前,给出了大规模并行的错觉。这一点的目的是确保模型以确定的,可重复的方式执行。

HDL和JS之间的区别在于,它是非常好的定义和HDL的基础,虽然它掩盖了JS。这是SystemC LRM的一个摘录,其中简要介绍了它 - 例如,在VHDL LRM中定义得更好。

由于过程实例执行不中断,只有单一 流程实例可以在任何一个时间处于运行状态,并没有其它进程 实例可以执行,直到当前执行的过程实例 已经产生控制给内核。一个进程不能抢先或中断另一个进程的执行。这被称为 协同例程语义或合作多任务。

+0

我根本不称之为JS的“掩饰”,而不是[根据最新规范](http://www.ecma-international.org/ecma-262/6.0/index.html#sec-jobs - 和作业队列)。 '事先有点含糊不清(但在某些情况下已经确立)。 –

+0

谢谢,没有看到。 – EML

相关问题