Веб-работники используют актерскую модель?

Я пытался понять, как работают актерские модели и веб-работники.

В https://dzone.com/articles/html5-web-workers-classic: "Веб-работники предоставляют модель передачи сообщений, в которой сценарии могут обмениваться данными только через четко определенные неизменяемые сообщения, не обмениваться данными и не использовать механизмы синхронизации для сигнализации или целостности данных."

Для меня это звучит очень похоже на модель актера. Есть ли разница?

ОБНОВЛЕНИЕ: Согласно Бенджамину Эрбу:

"Фундаментальная идея модели актора заключается в использовании акторов в качестве параллельных примитивов, которые могут действовать при получении сообщений различными способами:

1.Отправить ограниченное количество сообщений другим участникам.
2. Создайте конечное число новых актеров.
3. Измените свое внутреннее поведение, вступив в силу при обработке следующего входящего сообщения."

Первые два применяются, но как насчет последнего?

1 ответ

Решение

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

Есть одна вещь, на которую я бы хотел обратить ваше внимание:

Нет требований по порядку прибытия сообщения

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

Изменить собственное внутреннее поведение, вступив в силу при обработке следующего входящего сообщения (согласно вашему "обновлению")

Этот тип противоречит предыдущему. Но любой, кто хотя бы прочитал учебник для веб-работников, ответ очевиден: да, работник может это сделать. Рассмотрим следующий код:

var name = "Worker";
self.addEventListener("message", (e)=>{
  if(typeof e.data.newName=="string") {
    name = e.data.newName;
  }
  if(e.data.command == "sendName") {
    self.postMessage({myName: name});
  }
});

Само собой разумеется, если вы отправите новое имя работнику, ответ на "sendName" сообщения будут отличаться от этого момента. Такое изменение поведения тривиально, но может быть сколь угодно сложным.


Если вы интересуетесь моделью актера, посмотрите также реализацию JavaScript в Vert.x.

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

Другие вопросы по тегам