【发布时间】:2020-03-24 22:42:39
【问题描述】:
我有什么方法可以在两个网络工作者之间共享一个变量吗? (Web Worker 基本上是 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 来存储 ints/strings...再次,对象 [包括数组/null] 必须被转换成 JSON……然后,JSON.parse()'d。
据我所知,Javascript 工作线程与主页面线程完全隔离[这就是 Javascript 工作线程无法访问 DOM 元素的原因
虽然 postMessage 有效,但速度很慢。
【问题讨论】:
-
你可以使用sharedArrayBuffer,它会在发送到postMessage时被克隆。这是一篇关于它的文章link
标签: javascript html global-variables local-storage web-worker