代码之家  ›  专栏  ›  技术社区  ›  Warty

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

  •  8
  • Warty  · 技术社区  · 14 年前

    我有没有办法在两个网络工作者之间共享一个变量?(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]

    本地存储/数据库已从HTML5规范中删除,因为它可能导致死锁,所以这不是一个选项[遗憾的是]……

    我发现的另一种可能性是使用php实际拥有getvariable.php和setvariable.php页面,它们使用localstorage存储ints/strings…再次,对象[包括数组/null]必须转换为JSON…稍后,json.parse()'d。

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

    尽管后消息有效,但速度很慢。

    谢谢!

    4 回复  |  直到 9 年前
        1
  •  10
  •   Jeff Walden    12 年前

    网络工作者故意不分享任何东西——一个工作者的所有东西都完全隐藏在其他工作者和浏览器的页面中。如果有任何方法可以在工作人员之间共享非“原子”值,那么这些值的语义几乎不可能用于可预测的结果。现在,一个 能够 在一定程度上,引入锁作为使用这些值的一种方法——获取锁,检查并修改值,然后释放锁——但是锁很难使用,而且由于通常的失败模式是死锁,所以您可以很容易地“构建”浏览器。这对开发人员或用户没有好处( 尤其地 如果您认为Web环境非常适合非程序员的实验,他们甚至从未听说过线程、锁或消息传递),那么另一种选择就是在浏览器中的工作人员或页面之间不共享状态。您可以将消息(可以将其视为“通过线路”序列化)传递给工作者,然后工作者根据序列化信息创建其自己的原始值副本),而无需解决任何这些问题。

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

        2
  •  5
  •   Eli Grey    14 年前

    没有,但是您可以向Web工作者发送消息,这些消息可以是数组、对象、数字、字符串、布尔值和ImageData,也可以是它们的任意组合。网络工作者也可以发回信息。

        3
  •  3
  •   Community noseratio    7 年前

    有两个选项可以在专用员工之间共享数据:

    1。 Shared Workers

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

    Spawning a Shared Worker in a Dedicated Worker

    2.第2条。 Channel Messaging API

    Channel Messaging API允许在 附加到同一文档的不同浏览上下文(例如,两个 iframes,或主文档和iframe,通过 共享者,或两个工人)直接交流,通过 通过双向通道(或管道)彼此之间的消息 两端各有一个端口。

    How to call shared worker from the web worker?

        4
  •  2
  •   Kevin Hakanson    14 年前

    我最近读到(但没有用过)。 shared workers .根据 Share the work! Opera comes with SharedWorker support ,仅支持最新的浏览器(Opera 10.6、Chrome 5、Safari 5)。