簡體   English   中英

在網絡工作者之間共享變量? [全局變量?]

[英]Sharing variables between web workers? [global variables?]

有什么辦法可以讓我在兩個網絡工作者之間共享一個變量? (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 ......盡管這看起來效率很低 [特別是對於對象,我有為 AFAIK 使用 JSON]

LocalStorage/Database 已從 HTML5 規范中刪除,因為它可能導致死鎖,因此這不是一個選項 [可悲]...

我發現的另一種可能性是使用 PHP 實際上有一個 getVariable.php 和 setVariable.php 頁面,它們使用 localstorage 來存儲整數/字符串......再次,對象 [包括數組/空] 必須轉換為JSON...然后是 JSON.parse()'d。

據我所知,Javascript 工作線程與主頁面線程完全隔離[這就是 Javascript 工作線程無法訪問 DOM 元素的原因

盡管 postMessage 有效,但速度很慢。

Web worker 是故意不共享的——worker 中的所有內容都對其他 worker 和瀏覽器中的頁面完全隱藏。 如果有任何方法可以在 worker 之間共享非“原子”值,那么這些值的語義幾乎不可能用於可預測的結果。 現在,人們可以在某種程度上引入鎖作為使用這些值的一種方式——您獲取鎖,檢查並可能修改該值,然后釋放鎖——但是鎖使用起來非常棘手,因為通常失敗模式是死鎖,你可以很容易地“磚”瀏覽器。 這對開發人員或用戶來說都沒有好處(尤其是當您考慮到 Web 環境非常適合那些從未聽說過線程、鎖或消息傳遞的非程序員進行實驗時),因此替代方案是在兩者之間不共享狀態瀏覽器中的工作人員或頁面。 您可以將消息(可以將其視為“通過網絡”序列化給工作人員,然后工作人員根據序列化信息創建自己的原始值副本)而不必解決任何這些問題。

確實,消息傳遞是支持並行性而又不讓並發問題完全失控的正確方法。 正確安排您的消息傳遞,您應該擁有與共享狀態一樣多的權力。 你真的不想要你認為你想要的替代品。

不,但您可以向網絡工作者發送消息,這些消息可以是數組、對象、數字、字符串、布爾值和 ImageData 或這些的任意組合。 網絡工作者也可以發回消息。

有兩種方法可以在專用 worker 之間共享數據:

1. 共享工人

SharedWorker 接口代表一種特定類型的工作器,可以從多個瀏覽上下文訪問,例如多個窗口、iframe 甚至工作器。

在專用工作線程中生成共享工作線程

2. 頻道消息API

Channel Messaging API 允許在附加到同一文檔的不同瀏覽上下文中運行的兩個單獨腳本(例如,兩個 IFrame,或主文檔和一個 IFrame,通過 SharedWorker 的兩個文檔,或兩個工作程序)直接通信,在一個之間傳遞消息另一個通過兩端各有一個端口的雙向通道(或管道)。

如何從網絡工作者調用共享工作者?

我最近閱讀了(但沒有使用過) 共享的 workers 根據分享作品! Opera 自帶 SharedWorker 支持,僅支持最新的瀏覽器(Opera 10.6、Chrome 5、Safari 5)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM