在网络工作者之间共享变量?[全局变量?]
-
20-09-2019 - |
题
有什么办法可以让我在两个网络工作者之间共享变量吗?(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或它们的任意组合。网站工作人员可以将消息发送回了。
我最近读到(但没有使用过), 共享工人. 。根据 分享工作!Opera 附带 SharedWorker 支持, ,仅在最新的浏览器(Opera 10.6、Chrome 5、Safari 5)中支持。