спецификация ECMAScript определяет Atomics объект в разделе 24,4 .

Среди всех глобальных объектов это темнее для меня, поскольку я не знал о его существовании, пока не прочитал его спецификацию, а также у Google не так много ссылок на него (или, возможно, название слишком общее и все погружается в воду?).

Согласно его официальному определению

Объект Atomics предоставляет функции, которые работают неделимо (атомарно) в ячейках массива совместно используемой памяти, а также функции, которые позволяют агентам ожидать и отправлять примитивные события.

Таким образом, он имеет форму объекта с множеством методов для обработки низкоуровневой памяти и регулирования доступа к ней. А также его общедоступный интерфейс заставляет меня предположить это. Но каково на самом деле использование такого объекта для конечного пользователя? Почему это публично? Есть ли примеры, где это может быть полезно?

Спасибо

12
Cristian Traìna 25 Авг 2017 в 00:06

3 ответа

Лучший ответ

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

  • Нет необходимости копировать данные для передачи в потоки
  • Потоки могут общаться без использования цикла событий
  • Потоки могут общаться намного быстрее

Примере:

var arr = new SharedArrayBuffer(1024);

// send a reference to the memory to any number of webworkers
workers.forEach(worker => worker.postMessage(arr));

// Normally, simultaneous access to the memory from multiple threads 
// (where at least one access is a write)
// is not safe, but the Atomics methods are thread-safe.
// This adds 2 to element 0 of arr.
Atomics.add(arr, 0, 2)

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

Чтобы сделать это безопасным, браузеры должны запускать страницы отдельным процессом для каждого домена. Chrome начал делать это в версии 67, а общая память была снова включена в версии 68.

15
Arseniy-II 12 Окт 2018 в 08:49

В дополнение к тому, что заявили Арсений-II и Саймон Пэрис, Atomics также удобна, когда вы встраиваете движок JavaScript в какое-то хост-приложение (чтобы включить в нем скрипты). Затем можно напрямую обращаться к разделяемой памяти из разных параллельных потоков одновременно, как из JS, так и из C / C ++ или любого языка, на котором написано ваше хост-приложение, без использования JavaScript API для доступа на стороне C / C ++ / OtherLanguage.

4
Pavlo Mur 11 Окт 2018 в 15:03

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

Проблема, которую решает Atomics, заключается в том, как WebVorkers могут общаться друг с другом (легко, быстро и надежно) . Вы можете прочитать о ArrayBuffer, SharedArrayBuffer, Atomics и о том, как вы можете использовать их для своих преимуществ здесь.

Вы не должны беспокоиться об этом, если:

  • Вы создаете что-то простое (например, магазин, форум и т. Д.)

Вам это может понадобиться, если:

  • Вы хотите создать что-то сложное, потребляющее память (например, figma или google drive)
  • Это нужно, если вы хотите работать с WebAssembly или webgl и хотите оптимизировать производительность
  • Также вам может понадобиться, если вы хотите создать какой-то сложный модуль Node.js
  • Или, если вы создаете сложное приложение через Electron, например, Skype или Discord

Спасибо, Павло Мур и Саймон Париж за ваши ответы!

6
Dmitry 31 Дек 2018 в 12:11