Javascript HTML5网络工作者-所有一个文件

Javascript HTML5网络工作者-所有一个文件,javascript,multithreading,html,web-worker,Javascript,Multithreading,Html,Web Worker,目前我有以下代码: 这在我的HTML文档中 <script language="JavaScript" type="text/javascript" src="workerTest.js"></script> 我更愿意在workerTest.js中声明我的所有作品和代码,并能够从一个外部文件中创建它们 大概是 var iWorker2 = new Worker('scripttagid'); 显然上面的代码是错误的,但我希望它能说明我的观点 这可能吗?如果是的话,有人

目前我有以下代码:

这在我的HTML文档中

<script language="JavaScript" type="text/javascript" src="workerTest.js"></script>
我更愿意在workerTest.js中声明我的所有作品和代码,并能够从一个外部文件中创建它们

大概是

var iWorker2 = new Worker('scripttagid');
显然上面的代码是错误的,但我希望它能说明我的观点

这可能吗?如果是的话,有人能给我指出正确的方向吗?可能是一些示例代码

如果这是不可能的,最好的方法是什么来避免大量的工作文件。因为会有很多工作。

嗯,有点:

<!-- won't be executed by browser because of the invalid type -->
<script type="text/worker" id="worker-code">
while(true) {

}
</script>
请注意,您也不需要该元素,只是将代码存储在字符串中,如
,而(true){}
很难维护

演示:(处理器使用率将激增,但您可以使用该页面,因为它不在UI线程中运行)

此外,从中,我发现您可以加载外部脚本,或实现子工作程序或内联工作程序

内联工作人员使用Esailija描述的BlobBuilder技术

引述:

加载外部脚本

可以使用importScripts()函数将外部脚本文件或库加载到辅助程序中。该方法接受零个或多个表示要导入的资源的文件名的字符串

此示例将script1.js和script2.js加载到worker中:

worker.js:

importScripts('script1.js');
importScripts('script2.js');
也可以编写为单个导入语句:

importScripts('script1.js', 'script2.js');
下属

工人有能力产生童工。这对于在运行时进一步分解大型任务非常有用。但是,子员工有几个注意事项:

子工作区必须与父页面位于同一原点内。 子工作区内的URI相对于其父工作区的位置进行解析(与主页相对)。 请记住,大多数浏览器都会为每个工作进程生成单独的进程。在你去产卵一个工人农场之前,要小心不要占用太多用户的系统资源。这样做的一个原因是,在主页和辅助页之间传递的消息是复制的,而不是共享的。请参阅通过消息传递与工作人员通信

有关如何生成子工作者的示例,请参见规范中的示例

内联工人


如果您想动态创建工作程序脚本,或者创建一个自包含页面而不必创建单独的工作程序文件,该怎么办?使用新的BlobBuilder界面,您可以通过创建BlobBuilder并将工作代码作为字符串附加在同一HTML文件中作为主逻辑“内联”您的工作程序:

您可以使用我的小插件


据我所知,javascript是单线程的,每页只能有一个进程,这就是为什么while循环可以冻结整个站点。我希望其他人能提供更多细节。谢谢你指出,很遗憾,据我所知,它必须是每个网络工作者的外部文件,希望有人能够解决这个问题…这是一个很好的答案,但如果没有Blob Builder,主浏览器将是chrome,或为Blackberry编写Webworks应用程序Playbook@LiamMcCannchrome使用
WebKitBlobBuilder
,不了解blackberry,您必须检查此处使用的所有功能以获得支持。我认为chrome会支持WebKitBlobBuilder,因为它是webkit浏览器。@Liammcann我没有黑莓,我如何测试它呢?在谷歌搜索了一下之后,它似乎应该通过
window.BlobBuilder
window.WebKitBlobBuilder
来支持它。。你可以测试一下。
importScripts('script1.js');
importScripts('script2.js');
importScripts('script1.js', 'script2.js');
var worker_url = Worker.create(function(e){
  self.postMessage('Example post from Worker'); //your code here
});
var worker = new Worker(worker_url);