8

Есть ли способ обменяться между двумя веб-работниками? (Веб-работники в основном нити в Javascript)Обмен переменными между веб-работниками? [global variables?]

В таких языках, как 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, поскольку это может привести к deadlocks, так что это не вариант [печально] ...

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

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

Хотя PostMessage работает, это очень медленный процесс.

Спасибо!

ответ

8

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

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

+0

Если бы какой-нибудь способ разделить не «атомные» ценности между работниками, семантика этих значений будет невозможно использовать с предсказуемыми результатами <-. Совершенно неправильно во всех отношениях. – Tony

+0

Ухаживать за разработкой? –

+0

Алгоритм выпечки Лампорта. Дейкстра охраняла командную логику. Все это специально для недетерминированной предсказуемости. – Tony

5

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

2

Есть два варианта для обмена данными между рабочими посвященных:

1. Shared Workers

SharedWorker интерфейс представляет определенный вид работника, который можно получить доступ из нескольких просмотра контекстов, например как несколько окон, iframe или даже рабочих.

Spawning a Shared Worker in a Dedicated Worker

2. Channel Messaging API

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

How to call shared worker from the web worker?

+0

Общие работники - это рабочие, которые могут быть связаны в сети сообщений, а не простое дерево сообщений посвященных работников. Однако основной принцип работников справедлив: вы не можете делиться чем-нибудь между работниками, только передавать сообщения. – solendil

+1

Но совместимость:/https://developer.mozilla.org/en-US/docs/Web/API/SharedWorker#Browser_compatibility – Luckylooke