Совместное использование переменных между веб-работниками? [глобальные переменные?] - PullRequest
9 голосов
/ 14 февраля 2010

Могу ли я поделиться переменной между двумя веб-работниками? (Веб-работники в основном являются потоками в 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]

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 18 февраля 2010

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

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

5 голосов
/ 15 февраля 2010

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

4 голосов
/ 16 июня 2015

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

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

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

Нерест общего работника в выделенном работнике

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

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

Как позвонить общему работнику из веб-работника?

2 голосов
/ 30 августа 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...