Javascript 在网络工作者之间共享变量?[全局变量?]

Javascript 在网络工作者之间共享变量?[全局变量?],javascript,html,global-variables,local-storage,web-worker,Javascript,Html,Global Variables,Local Storage,Web Worker,我有没有办法在两个web工作人员之间共享一个变量?(Web工作者基本上是Javascript中的线程) 在c#等语言中,您有: public static string message = ""; static void Main() { message = "asdf"; new Thread(mythread).Run(); } public static void mythread() { Console.WriteLine(message); //outputs "asdf" }

我有没有办法在两个web工作人员之间共享一个变量?(Web工作者基本上是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进行AFAIK]

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

我发现的另一种可能性是使用PHP实际拥有一个getVariable.PHP和setVariable.PHP页面,这两个页面使用localstorage存储int/string…再次,必须将对象[包括数组/null]转换为JSON…然后再转换为JSON.parse()'d

据我所知,Javascript工作线程与主页线程完全隔离[这就是Javascript工作线程无法访问DOM元素的原因]


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

不可以,但您可以向web worker发送消息,这些消息可以是数组、对象、数字、字符串、布尔值和图像数据,也可以是这些的任意组合。web worker也可以发回消息。

web workers故意不共享任何内容—worker中的所有内容都对其他worker完全隐藏和来自浏览器中的页面。如果有任何方法可以共享非“原子”在工作者之间,这些值的语义几乎不可能用于可预测的结果。现在,可以引入锁作为使用这些值的一种方式,在一定程度上——您获取锁,检查并可能修改该值,然后释放锁——但是锁的使用非常棘手,因为通常的故障模式是死锁,你可以很容易地“砖”浏览器。这对开发人员或用户来说是不好的(尤其是当你认为网络环境非常适合那些从未听说过线程、锁或消息传递的非程序员)。,因此替代方法是在浏览器中的工作程序或页面之间不共享状态。您可以将消息(可以将其视为“通过连接”序列化的消息传递给工作程序,然后工作程序根据序列化信息创建其自己的原始值副本)而无需解决这些问题


事实上,消息传递是支持并行性的正确方法,而不会让并发问题完全失控。正确地安排消息传递,你应该拥有尽可能多的权力,就像你可以共享状态一样。你真的不想要你认为想要的替代方案。

我最近读到了(但尚未使用),。根据,仅在最新的浏览器(Opera 10.6、Chrome 5、Safari 5)中提供支持。

有两种方法可以在专门的工作人员之间共享数据:

1.

SharedWorker接口表示一种特定类型的工作人员 可以从多个浏览上下文访问,例如 窗户、iFrame甚至工人

2.

通道消息传递API允许在中运行两个单独的脚本 附加到同一文档的不同浏览上下文(例如,两个 IFrames,或主文档和IFrame,通过 共享工作人员(或两名工作人员)直接沟通,通过 通过双向通道(或管道)彼此之间的消息 两端各有一个端口


如果有任何方法可以在工作人员之间共享非“原子”值,那么这些值的语义将不可能用于可预测的结果。兰波特的烘焙算法。Dijkstra保护的命令逻辑。这一切都是专门针对非确定性可预测性的。很好,“几乎不可能”,那么。共享非简单数据很容易出错,这是事实,因此你无法与网络工作者合作。你真正想说的是,大多数程序员在该领域的经验和领域知识将导致几乎不可预测的结果。在编程中,所有的力量都来自于责任ty;或减轻风险的模式。:pSure。鉴于完全是垃圾,污染了web上的大部分代码,我认为我有理由怀疑web开发人员正确使用任何类型的东西的能力。共享工作者是可以链接到消息网络中的工作者,而不是专门工作者的简单消息树s、 然而,workers的基本原则是:您不能在workers之间共享任何内容,只能传递消息。但是兼容性:/n您可以使用sharedArrayBuffer,它将在发送到postMessage时被克隆。下面是一篇关于它的文章