Является ли манипулирование documentFragment в webWorker законным в принципе (многопоточность)?
1.main_thread и work_thread ничего не делят (ничего общего не делятся)
2. Построение domFragment на некотором уровне структуры (основанном на данных), все в main_thread занимает немного времени и может быть разделено на рабочие места для worker_thread.
Тем не менее, я могу теперь найти передать DocumentFragment в work_thread
postMessage(fragment) // no way
postMessage({f:fragment}) // no way ,same reason above(serialization)
postMessage(fragment,[fragment]) // no way, type checking , must be a buffer type...
может быть, такая оптимизация не стоит усилий? любые комментарии?
1 ответ
Как сказано в спецификации W3C, невозможно использовать API-интерфейс DOM из основного потока с рабочим потоком.
Выдержка из спецификации:
API-интерфейсы DOM (объекты Node, объекты Document и т. Д.) Недоступны для работников [...]
Поскольку DocumentFragment наследует, по крайней мере, от Node, отсылать его веб-работнику должно быть (почти) невозможно. Я сказал почти, потому что может быть возможно отправить его в виде строки (например, через innerHTML), но это означает, что вам придется каким-то образом анализировать его в рабочем потоке или собирать информацию из этой строки. Лично я не думаю, что есть какой-то умный способ сделать это.
Возможным решением может быть передача необработанных данных в виде JSON вашему рабочему потоку, создание строки и передача этой строки обратно.