Я работаю с изолятами прямо сейчас и хотел бы знать, является ли использование IndexedDB для обмена данными между изолятами хорошим способом общения? В частности, я хочу, чтобы один изолят мог писать в него, а затем сообщал другим изолятам, что они могут только читать его. Это данные, которые будут считаться неизменными после того, как они будут записаны и будут достаточно большими. Основная причина, по которой я хочу это сделать, заключается в том, что я не хочу отправлять карту размером 6 МБ в 3 разных изолята, поскольку это немного интенсивно для программы.
Общая память между изолятами с использованием IndexedDB
Ответы (2)
Веб-воркеры позволяют передавать буферы массивов между воркерами без копирования. Однако, как только вы передаете буфер массива другому рабочему процессу, исходный рабочий процесс теряет доступ к его содержимому.
Таким образом, вы можете попробовать сохранить свою структуру данных в буфере массива, чтобы воспользоваться этим.
См. эту статью mdn и html5rocks.
Поэтому для Dart храните свои данные в ByteData и то при компиляции через dartjs это надо не копировать, а передавать.
Примечание: Mozilla также проводит некоторые эксперименты с общим изменяемым доступом к буферам массива для нескольких веб-воркеров. Это позволяет emscripten компилировать многопоточный код c в javascript. Такой общий доступ, скорее всего, займет некоторое время, прежде чем он будет стандартизирован и широко внедрен.
Если вы все равно хотите хранить данные в IndexedDB, это нормально. Если вы делаете это только для оптимизации общения, я не думаю, что это лучше, чем отправка напрямую. Сериализация/десериализация обычно является наиболее интенсивной частью ЦП. Использование IndexedDB дополнительно записывает один раз и читает три раза на/с медленного диска.