2012-05-14 17 views
15

¿Hay alguna forma de esperar o buscar sincrónicamente un nuevo mensaje en un web-worker?Espera de forma sincrónica para el mensaje en Web-Worker

Tengo un gran cuerpo de código complicado (LLVM compilado de emscripten) que no puedo refactorizar en torno a las devoluciones de llamada.

Necesito asegurarme de que el código después de cierta línea no se ejecute hasta que reciba y maneje un mensaje del hilo de UI. Si bloqueo con un while-loop, el evento-loop nunca se ejecuta, así que no puedo recibir mensajes.

+0

Habría una solución a su problema si ECMAScript fuera un lenguaje tan rico como Scheme con su 'call-with-continuation'. Esto le permitiría capturar la continuación actual y volver a llamarla en su controlador 'onmessage'. – Marc

Respuesta

0

No, desafortunadamente. Hubo una discusión sobre cómo agregar una forma de bloquear un mensaje de la página principal, pero no llegó a ninguna parte. Veré si puedo desenterrar el hilo de la lista de correo relevante.

1

¿Se puede dividir la secuencia de la siguiente manera sin refactorizar?

wrk.onmessage = function(e) { 
    if (e.data.step === 'initial input') { 
     doInitialWork(e.data.inputs) 
    } else if (e.data.step === 'ui input') { 
     doTheRest(e.data.uiData) 
    } 
} 

El evento onmessage se bloqueará hasta que la pila inicial de ejecución de paso se ha completado y los bits de interfaz de usuario críticos sólo se pondrá en marcha cuando y si la información está disponible.

0

Un truco crudo para hacer esto podría ser utilizar una API síncrona, como la API FileSystem, y utilizar un archivo temporal como mecanismo de sincronización.

En su ejemplo, el código del emscripten podría emitir una lectura sincrónica en un archivo, mientras que el subproceso de la interfaz de usuario escribe en el mismo archivo, desbloqueando efectivamente al trabajador.

Cuestiones relacionadas