JavaScript Worker - 并行写入控制台

时间:2014-01-01 21:24:15

标签: javascript multithreading web-worker

根据众多教程和文档(例如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}}消息。

Chrome Debug

我想我错过了一些关于Worker如何真正起作用的重要内容。或者可能是使用{{1}}?

引起的问题

1 个答案:

答案 0 :(得分:1)

没有关于控制台。*方法如何工作的规范或一系列要求 - 它们不是正式的一部分 JavaScript,但是由托管环境添加到JS。 因此,不同的浏览器和JS环境可以随心所欲地进行,这有时会导致混乱的行为。 特别是,有一些浏览器和一些条件,console.log(..)实际上不会立即输出 它给了什么。这可能发生的主要原因是因为I / O是许多程序中非常缓慢和阻塞的部分(不是 只是JS)。因此,它可能会更好地(从页面/ UI角度来看)浏览器异步处理控制台I / O. 背景,没有你甚至不知道发生了什么。

如果遇到这种罕见的情况,最好的选择是在JS调试器中使用断点而不是依赖断点 控制台输出。下一个最好的选择是强制快照&#34;通过将其序列化为字符串来讨论该对象, 和JSON.stringify(..)一样。