根据众多教程和文档(例如http://www.w3schools.com/html/html5_webworkers.asp),JavaScript的new Worker(...)
应该在浏览器中创建一个新线程并并行运行...
脚本。我已经测试了一些示例,看起来这些工作人员似乎在我的浏览器中工作(Chrome 31.0.1650.63 m)。
所以我尝试制作一个简单的脚本,看看在JavaScript中使用多线程的绝佳机会。我们来看看它:
function main()
{
var newThread = new Worker("worker.js");
writeToConsole();
}
function writeToConsole()
{
for (var i = 0; i < 20; i++)
{
console.log("main thread");
}
}
worker.js :
for (var i = 0; i < 20; i++)
{
console.log("second thread");
}
类似的代码在C ++这样的语言中会做什么[例如SFML Threads]是这样的:
main thread
main thread
second thread
main thread
second thread
...
然而,当我在浏览器中运行main()
函数时,它首先写main thread
二十次,然后main
函数返回(未定义),然后它记录second thread
二十倍console.log()
1}}消息。
我想我错过了一些关于Worker如何真正起作用的重要内容。或者可能是使用{{1}}?
引起的问题答案 0 :(得分:1)
没有关于控制台。*方法如何工作的规范或一系列要求 - 它们不是正式的一部分 JavaScript,但是由托管环境添加到JS。 因此,不同的浏览器和JS环境可以随心所欲地进行,这有时会导致混乱的行为。 特别是,有一些浏览器和一些条件,console.log(..)实际上不会立即输出 它给了什么。这可能发生的主要原因是因为I / O是许多程序中非常缓慢和阻塞的部分(不是 只是JS)。因此,它可能会更好地(从页面/ UI角度来看)浏览器异步处理控制台I / O. 背景,没有你甚至不知道发生了什么。
如果遇到这种罕见的情况,最好的选择是在JS调试器中使用断点而不是依赖断点 控制台输出。下一个最好的选择是强制快照&#34;通过将其序列化为字符串来讨论该对象, 和JSON.stringify(..)一样。