Как динамически увеличить размер SharedArrayBuffer - PullRequest
0 голосов
/ 07 октября 2018

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

Полученные данные представляют собой 100-байтовый пакет.Каждый раз, когда я получаю пакет, я создаю 100-байтовый SharedArrayBuffer и отправляю его дочернему потоку через postMessage().Но основной поток получает данные очень быстро, поэтому необходимо часто вызывать postMessage, чтобы уведомить подпоток, что приводит к высокой загрузке ЦП ... влияет на скорость ответа основного потока

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

Я хотел бы спросить, как динамически увеличить длину SharedArrayBuffer.Я пытался реализовать его в цепочке, сохраняя объект SharedArrayBuffer в другом объекте SharedArrayBuffer, но браузер не позволяет этого.

1 Ответ

0 голосов
/ 10 октября 2018

Я хотел бы спросить, как динамически увеличить длину SharedArrayBuffer.

Из MDN веб-документов (выделено) .

"Объект SharedArrayBufferиспользуется для представления универсального буфера необработанных двоичных данных фиксированной длины, аналогичного объекту ArrayBuffer, но таким образом, что их можно использовать для создания представлений в общей памяти. "

Фиксированная длина означает, что вы не можете изменить его размер ... поэтому неудивительно, что у него нет метода resize ().

(Примечание: одна вещьэто приходит мне в голову, хотя я полагаю, что существует совершенно новая возможность для SharedArrayBuffer использоваться в WebAssembly в качестве «линейной памяти» с оператором grow_memory.очень трудно, если это вообще возможно, и, вероятно, не будет поддерживаться во многих браузерах, если бы это было так.)


Я попытался реализовать это в цепочке,сохранение объекта SharedArrayBuffer в другом объекте SharedArrayBuffer, но браузер делаетне допустить этого.

Нет.Вы можете писать только числа.

Может показаться, что вы можете использовать число для индексации в таблице SharedArrayBuffers и связать их таким образом.Но тогда вам нужно беспокоиться о том, как разделить эту таблицу между потоками - та же проблема.

Так что, независимо от того, что вы делаете, какой бы поток не принял решение обновить структуру общей буферизации, он должен будет уведомить других ообновление как-то.Чтобы это уведомление могло передавать SharedArrayBuffers, оно должно будет использовать postMessage для этого.

Рассматривали ли вы эксперимент с выделением большего SharedArrayBuffer для начала и рассматривали его как кольцевой буфер так, чтобы основной поток считывал из записей, которые делают подпотоки, в шаблоне «производитель / потребитель»?

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

...