2012-10-05 1 views
15

Есть ли способ передать большие объемы данных (несколько МБ) между веб-работником и основным потоком? Я работаю в проекте, где мне нужно загружать файлы, немного модифицировать их, а затем каким-то образом позволить пользователю загружать измененный файл. Я нашел следующие способы передачи данных между веб-работником и основным пользовательским интерфейсомПередайте большие объемы данных между веб-работником и основной темой

  1. Использование обычного метода postMessage.
  2. Использование переносимых объектов (Chrome только)
  3. Создать ссылку URL к сгустка и только отправить URL (работает в Chrome, в других, а?)

Я думаю, что (1) в порядке, когда отправляя меньшие объекты, но занимает много времени и пространства при работе с файлами размером более нескольких МБ, поскольку он сериализуется и отправляется как JSON. Chrome предлагает способ передачи данных с помощью переносимых объектов, где данные не нужно копировать. К сожалению, это пока только функция Chrome, поскольку в противном случае это послужило бы моей цели.

Последнее, что я нашел, - это от рабочего, создать URL-адрес для blob с использованием self.webkitURL, а затем передать только ссылку URL-адреса для пользовательского интерфейса. Это хорошо работает, я могу предоставить URL-адрес пользователю, и они могут загрузить файл. Я, к сожалению, не нашел способ сделать это в Firefox, возможно ли это?

Есть ли какие-либо другие методы, которые можно использовать для передачи данных между работниками и основным потоком?

ответ

2

В соответствии с этим WebWorkers tutorial, WebWorkers теперь поддерживают передачу файлов и объектов Blob и в основном любого объекта, который может использоваться с structured clone algorith ... или, по крайней мере, Chrome делает это, возможно, потому, что он вставляет API FileSystem. Я не знаю, является ли это основной причиной, но я надеюсь, что нет, и на самом деле эта функция реализована в других браузерах ... возможность обрабатывать выбранные пользователем файлы в фоновом режиме - это хорошо.

+0

К сожалению, это еще операция копирования, даже если это, конечно, увеличивает скорость. – Erik

10

Firefox/Opera/Chrome все в настоящее время поддерживают a flavor of web workers called Transferable Objects, что очень быстро - также очень легко настроить. Здесь мы отправляем ww (веб-работнику) выделенный в браузере массив, который заполняется ww и возвращается обратно в сторону браузера. Это передается по ссылке, а не копию: браузер < -> WW

На стороне браузера:

var huge_array = new Float32Array(SIZE); 

// worker.postMessage(huge_array.buffer);      // old way 
    worker.postMessage(huge_array.buffer, [huge_array.buffer]); // new Trans Obj 

, а затем через внутри веб-работника:

self.onmessage = function(e) { 

     var flt_arr = new Float32Array(e.data); 

    // typically you might want to populate flt_arr here 

    // now send data structure back to browser 

    // self.postMessage(flt_arr.buffer);     // old way 
     self.postMessage(flt_arr.buffer, [flt_arr.buffer]); // new Trans Obj way 
} 

просто поставить объект данных внутри квадратных скобок [здесь] это позволяет отключить js для использования режима переносимого объекта. Это также работает при отправке туда и обратно объектов javascript, содержащих несколько переменных, а не только типизированных массивов.

To quote:

Передаваемые объекты являются объектами, которые не копируются (например, используя нечто вроде структурированного клонирования). Вместо этого данные передаются из одного контекста в другой. «Версия» из вызывающего контекста больше не доступна после переноса в новый контекст. Например, при передаче ArrayBuffer из основного приложения в Worker исходный ArrayBuffer из основного потока очищается и больше не используется.Это значительно повышает производительность отправки данных на работника

http://html5-demos.appspot.com/static/workers/transferables/index.html https://html.spec.whatwg.org/multipage/workers.html

+0

Откуда у вас была цитата? – royhowie

+0

цитата от Эрика Бидельмана (сотрудник Google), появляется, если вы нажмете «Yo dawg, что это?». который появляется в верхней части URL-адреса, указанного выше ... его родительская ссылка: http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning-Fast –