有什么办法可以让我在两个网络工作者之间共享变量吗?(Web Workers 基本上是 Javascript 中的线程)

在像 c# 这样的语言中,你有:

public static string message = "";
static void Main()
{
 message = "asdf";
 new Thread(mythread).Run();
}
public static void mythread()
{
 Console.WriteLine(message); //outputs "asdf"
}

我知道这是一个糟糕的例子,但在我的 Javascript 应用程序中,我有一个线程执行繁重的计算,这些计算可以分布在多个线程中[因为我有大量数组形式的数据。数组的所有元素都是相互独立的。换句话说,我的工作线程不必关心锁定或类似的事情]

我发现在两个线程之间“共享”变量的唯一方法是创建一个 Getter/setter [通过原型],然后使用 postMessage/onmessage...虽然这看起来效率很低[特别是对于对象,据我所知我必须使用 JSON]

LocalStorage/Database 已从 HTML5 规范中删除,因为它可能导致死锁,因此这不是一个选项 [遗憾的是]...

我发现的另一种可能性是使用 PHP 实际上有一个 getVariable.php 和 setVariable.php 页面,它们使用 localstorage 来存储整数/字符串...再次,对象 [其中包括数组/null] 必须转换为 JSON...然后是 JSON.parse()'d。

据我所知,Javascript工作线程与主页面线程完全隔离[这就是为什么Javascript工作线程无法访问DOM元素

虽然 postMessage 可以工作,但是速度很慢。

有帮助吗?

解决方案

Web Workers是故意不共享 - 在一个工人都完全从其他工人和在浏览器页面隐藏。如果有任何的方式来分享工人之间非“原子”的价值观,这些价值观的语义几乎不可能的结果可想而知使用。现在,人们的可能的引进锁的方式来使用这些值,在一定程度上 - 你获得锁,检查和修改可能的值,然后释放锁 - 但锁是非常棘手使用,因为通常的故障模式是死锁,你将能够“砖”的浏览器很容易地。这是没有良好的开发者或用户(尤其的,当你考虑到网络环境是如此适合于由谁从来没有听说过线程,锁,或消息传递的非程序员的试验),所以另一种方法是没有在浏览器中的工人或页面之间共享状态。可以传递消息(其中之一可以认为作为串行化的“过线”,以工人,然后创建其自己的基于所述序列信息的原始值的副本),而不必处理这些问题的任何

真的,消息传递是支持并行性而不让并发问题得到完全失控的正确方法。妥善协调您的信息切换,你应该有每一点大的权力,如果你可以分享状态。你真的不希望你想你想的选择。

其他提示

没有,但你可以发送邮件到网络工作者可以是数组,对象,数字,字符串,布尔的ImageData或它们的任意组合。网站工作人员可以将消息发送回了。

有两种选择共享专用工人之间的数据:

<强> 1。 共享工人

  

在SharedWorker接口表示特定种类的工人该   可以从几个浏览上下文等几种访问   窗户,内置页框或甚工人。

在一个专用的辅助产卵一个共用工作

<强> 2。 通道消息API

  

在信道消息传送API允许在运行两个独立的脚本   连接到相同的文件不同的浏览上下文(例如,两个   IFRAME或主文档和一个IFrame,通过两个文件   SharedWorker,或两个工人)直接沟通,传递   (管道或)彼此之间的消息通过双向信道与   在每个端部的端口。

如何从网络工作者呼吁共享工人<? / A>

我最近读到(但没有使用过), 共享工人. 。根据 分享工作!Opera 附带 SharedWorker 支持, ,仅在最新的浏览器(Opera 10.6、Chrome 5、Safari 5)中支持。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top