Совместное использование переменных между веб-рабочими? [глобальные переменные?]

Есть ли какой-либо способ для меня совместно использовать переменную между двумя веб-рабочими? (Рабочие по сети являются в основном потоками в 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, у меня есть поток, делающий тяжелые вычисления, которые могут быть распространены через несколько потоков [так как у меня есть большой блок данных в форме массива. Все элементы массива независимы друг от друга. Другими словами, мои рабочие потоки не должны заботиться о блокировке или чем-либо как этот]

Я нашел, что единственный способ "совместно использовать" переменную между двумя потоками состоял бы в том, чтобы создать Метод считывания/метод set [через разработку прототипа] и затем использовать postMessage/onmessage..., хотя это кажется действительно неэффективным [особенно с объектами, которые я должен использовать JSON для AFAIK]

LocalStorage/Database был вынут из спецификации HTML5, потому что это могло привести к мертвым блокировкам, так, чтобы не была опция [печально]...

Другая возможность, которую я нашел, состояла в том, чтобы использовать PHP, чтобы на самом деле иметь getVariable.php и setVariable.php страницы, которые используют localstorage для хранения ints/strings... еще раз, Объекты [который включает массивы/пустой указатель], должны быть преобразованы в JSON... и затем позже, JSON.parse () 'd.

Насколько я знаю, рабочие потоки JavaScript полностью изолируются от основного потока страницы [который является, почему рабочие потоки JavaScript не могут получить доступ к элементам DOM

Хотя постсообщение работает, это медленно.

9
задан Aurélien Ooms 3 July 2019 в 13:09
поделиться

3 ответа

Web-воркеры намеренно не имеют общего доступа - все в воркере полностью скрыто от других воркеров и от страниц в браузере. Если бы существовал какой-либо способ разделить не «атомарные» значения между рабочими процессами, семантику этих значений было бы почти невозможно использовать с предсказуемыми результатами. Теперь один может ввести блокировки как способ использования таких значений до определенной степени - вы получаете блокировку, исследуете и, возможно, изменяете значение, а затем снимаете блокировку - но блокировки очень сложно use, и поскольку обычным режимом сбоя является тупик, вы можете довольно легко «заблокировать» браузер. Это бесполезно для разработчиков или пользователей ( особенно , если учесть, что веб-среда настолько удобна для экспериментов со стороны непрограммистов, которые даже не слышали о потоках, блокировках или передаче сообщений), поэтому Альтернативой является отсутствие общего состояния между рабочими процессами или страницами в браузере. Вы можете передавать сообщения (которые можно представить как сериализованные «по сети» рабочему процессу, который затем создает свою собственную копию исходного значения на основе сериализованной информации), не обращая внимания ни на одну из этих проблем.

Действительно, передача сообщений - это верный способ поддержки параллелизма, не позволяющий полностью вывести проблемы параллелизма из-под контроля. Правильно организуйте передачу сообщений, и у вас должно быть столько же полномочий, как если бы вы могли совместно использовать состояние. Вам действительно не нужна альтернатива, о которой вы думаете.

10
ответ дан 4 December 2019 в 10:03
поделиться

Нет, но вы можете отправлять сообщения веб-рабочим, которые могут быть массивами, объектами, числами, строками, логическими значениями , и ImageData или любая их комбинация. Веб-работники также могут отправлять сообщения обратно.

5
ответ дан 4 December 2019 в 10:03
поделиться

Я недавно читал (но не использовал) совместно используемых работников. По Поделись работой! Opera поставляется с поддержкой SharedWorker, поддержка есть только в новейших браузерах (Opera 10.6, Chrome 5, Safari 5).

2
ответ дан 4 December 2019 в 10:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: