根据大量教程和文档(例如 http://www.w3schools.com/html/html5_webworkers.asp ),JavaScript 的 new Worker(...)
应该在浏览器中创建一个新线程并运行 ...
并行脚本。我测试了一些示例,这些 Workers 似乎确实可以在我的浏览器(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
函数返回(未定义)然后它记录二十倍的第二个线程
消息。
我想我在这里遗漏了一些关于如何Worker的重要内容。真的有效。或者可能是使用 console.log()
引起的问题?
最佳答案
没有关于 console.* 方法如何工作的规范或一组要求 - 它们不是正式的一部分 JavaScript,而是由托管环境添加到 JS 中。 因此,不同的浏览器和 JS 环境会按照自己的意愿行事,这有时会导致令人困惑的行为。 特别是,有一些浏览器和一些条件console.log(..)实际上并没有立即输出 它给出了什么。发生这种情况的主要原因是 I/O 是许多程序中非常慢且阻塞的部分(不是 只是JS)。因此,浏览器异步处理控制台 I/O 的性能可能会更好(从页面/UI 的 Angular 来看) 背景,您可能甚至不知道发生了这种情况。
如果遇到这种罕见的情况,最好的选择是在 JS 调试器中使用断点,而不是依赖 控制台输出。下一个最佳选择是通过将有问题的对象序列化为字符串来强制生成该对象的“快照”, 就像 JSON.stringify(..) 一样。
关于JavaScript Worker - 并行写入控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20873428/