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

StackOverflow https://stackoverflow.com/questions/2262681

Вопрос

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

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

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

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

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

Хотя postMessage работает, он работает медленно.

Это было полезно?

Решение

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

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

Другие советы

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

Существует два варианта обмена данными между выделенными сотрудниками:

1. Общие работники

Интерфейс SharedWorker представляет определенный тип worker, к которому можно получить доступ из нескольких контекстов просмотра, таких как несколько windows, iframes или даже workers.

Создание общего рабочего в Выделенном рабочем

2. API обмена сообщениями по каналу

API обмена сообщениями по каналу позволяет запускать два отдельных скрипта в разных контекстах просмотра, прикрепленных к одному и тому же документу (например, два фрейма IFRAME или основной документ и IFrame, два документа через SharedWorker или два работника) для прямой связи, передавая сообщения друг другу по двусторонним каналам (или трубам) с портом на каждом конце.

Как вызвать shared worker из web worker?

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top