2012-10-05 21 views
15

¿Hay alguna manera de pasar grandes cantidades de datos (múltiples MB) entre un trabajador web y el hilo principal? Trabajo en un proyecto en el que necesito descargar archivos, modificarlos un poco y de alguna manera dejar que el usuario descargue el archivo modificado. Encontré las siguientes formas de pasar datos entre un trabajador web y la interfaz de usuario principalPase grandes cantidades de datos entre el trabajador web y el hilo principal

  1. Usando el método normal postMessage.
  2. Uso de objetos mobiliarios (cromo solamente)
  3. Crear una referencia URL a una burbuja y sólo enviar la dirección URL (funciona en Chrome, en otros también?)

Creo que (1) está bien cuando enviar objetos más pequeños, pero requiere mucho tiempo y espacio cuando se trata de archivos de más de unos pocos MB, ya que se serializa y se envía como JSON. Chrome ofrece una forma de transferir datos utilizando objetos transferibles donde los datos no tienen que copiarse. Lamentablemente, esta es solo una función de Chrome hasta ahora, ya que de lo contrario hubiera sido útil para mi propósito.

Lo último que encontré fue, para el trabajador, crear una URL para un blob utilizando self.webkitURL y luego solo pasar la referencia de URL a la interfaz de usuario. Esto funciona bien, puedo darle la URL al usuario y ellos pueden descargar el archivo. Desafortunadamente, no he encontrado una manera de hacer esto en Firefox, ¿es posible?

¿Hay algún otro método que podría usarse para transferir datos entre los trabajadores y el hilo principal?

Respuesta

2

De acuerdo con esta WebWorkers tutorial, WebWorkers Ahora Soporte a pasar objetos de archivo y de Blob y básicamente cualquier objeto que puede usarse con el structured clone algorith ... o al menos Chrome lo hace, probablemente debido a que implments la API de sistema de archivos. No sé si es la razón principal, pero espero que no y, de hecho, esta característica se implementa en otros navegadores ... poder procesar los archivos seleccionados por el usuario en segundo plano es algo bueno.

+0

Por desgracia eso es todavía una operación de copia, aunque ciertamente aumenta la velocidad. – Erik

10

Firefox/Opera/Chrome actualmente son compatibles con a flavor of web workers called Transferable Objects, que es extremadamente rápido, también extremadamente fácil de instalar. Aquí enviamos al ww (trabajador web) una matriz asignada por el navegador que está poblada por el ww y regresó al lado del navegador. Esto se pasa por referencia, no una copia: navegador < -> ww

En el lado del navegador:

var huge_array = new Float32Array(SIZE); 

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

y luego sobre el interior de la Web Worker:

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 
} 

con sólo poner el objeto de datos dentro de los corchetes [aquí] esto elimina js para usar el modo Objeto transferible. Esto también funciona cuando se envían javascript de ida y vuelta que contienen múltiples variables, no solo matrices tipadas.

To quote:

objetos transferibles son objetos que no se copian (por ejemplo, usando algo como clonación estructurado). En cambio, los datos se transfieren de un contexto a otro. La 'versión' del contexto de llamada ya no está disponible una vez transferida al nuevo contexto. Por ejemplo, al transferir un ArrayBuffer desde la aplicación principal a Worker, el ArrayBuffer original del hilo principal se borra y ya no se puede usar.Esto mejora enormemente el rendimiento de envío de datos a un trabajador

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

+0

¿De dónde sacaste la cotización? – royhowie

+0

la cita es de Eric Bidelman (miembro del personal de Google), parece que si hace clic en "Yo dawg, ¿qué es esto?" que aparece en la parte superior de la lista URL I de arriba ... su enlace principal es http://updates.html5rocks.com/2011/12/Transferable-Objects-Lightning- Fast –

Cuestiones relacionadas