SlideShare una empresa de Scribd logo
1 de 57
Descargar para leer sin conexión
1viernes 11 de octubre de 13
HTML5 WEB WORKERS
Dedicated	
  Workers
Inline	
  Workers
Shared	
  Workers
NachoVeiga
@VeigaNacho
1viernes 11 de octubre de 13
2viernes 11 de octubre de 13
Características
• Añade la capacidad de procesar scripts en el
background de las aplicaciones web.
2viernes 11 de octubre de 13
Características
• Añade la capacidad de procesar scripts en el
background de las aplicaciones web.
• Cada worker tiene su propio hilo de ejecución.
2viernes 11 de octubre de 13
Características
• Añade la capacidad de procesar scripts en el
background de las aplicaciones web.
• Cada worker tiene su propio hilo de ejecución.
• Sacan partido de los procesadores multi-núcleo.
2viernes 11 de octubre de 13
Características
• Añade la capacidad de procesar scripts en el
background de las aplicaciones web.
• Cada worker tiene su propio hilo de ejecución.
• Sacan partido de los procesadores multi-núcleo.
• Permiten separar tareas pesadas, evitando la
aparición de ventanas molestas “Unresponsive
script” debido al tiempo de ejecución.
01
2viernes 11 de octubre de 13
3viernes 11 de octubre de 13
Javascript - Web Workers
02
3viernes 11 de octubre de 13
4viernes 11 de octubre de 13
Web Workers vs Node + Web Sockets
La ventaja más evidente es la velocidad, los web workers son más rápidos.
Node.js se ejecuta desde un servidor mientras que los workers están en el navegador, lo cual
hace, por norma general, que sean más rápidos.
Además, Node necesita su propio servidor lo cual supone un coste extra al proyecto, tanto
monetario como de trabajo.
También tienen a su favor que los workers aprovechan el potencial de los procesadores multi-
núcleo, como ya comentamos, aunque esto puede ser un problema ya que eventualmente
pueden requerir más recursos de los que posees, utilizar toda la ram... utilizad 10 workers
como máximo, esto ya sería un poder tremendo.
Un factor a tener en cuenta hoy en día son los dispositivos móviles (tablets y móviles), si
utilizáis HTML5 Web Workers + Animaciones CSS3 + JS deberéis probar vuestra aplicación
web en diferentes dispositivos para ver si funciona correctamente y fluido.
03
4viernes 11 de octubre de 13
5viernes 11 de octubre de 13
Limitaciones
Los	
  Web	
  Workers	
  no	
  trabajan	
  en	
  el	
  contexto	
  global	
  de	
  la	
  ventana	
  del	
  
navegador,	
  por	
  lo	
  tanto	
  no	
  6enen	
  acceso	
  a:
•	
  El	
  objeto	
  window
•	
  El	
  objeto	
  document
•	
  El	
  objeto	
  console
•	
  El	
  objeto	
  parent
•	
  Y	
  tampoco	
  pueden	
  usar	
  librerías	
  que	
  dependan	
  de	
  estos,	
  
adiós	
  Jquery,Prototype...
04
5viernes 11 de octubre de 13
6viernes 11 de octubre de 13
¿A que tienen acceso?
Debido	
  a	
  su	
  naturaleza	
  mul6-­‐hilo,	
  solo	
  6enen	
  acceso	
  a	
  algunas	
  de	
  las	
  
caracterís6cas	
  de	
  Javascript,	
  os	
  dejo	
  una	
  lista:
• El objeto navigator
• El objeto location ( solo lectura )
• La función XMLHttpRequest (Ajax)
• setTimeout() / clearTimeout() y setInterval() / clearInterval()
• Cache
• Importar scripts usando el método importScripts()
• Web Sockets
• Web SQL Databases
• Web Workers
05
6viernes 11 de octubre de 13
7viernes 11 de octubre de 13
Compatibilidad
06
7viernes 11 de octubre de 13
8viernes 11 de octubre de 13
Comprobando la compatibilidad
Existen	
  muchas	
  formas	
  diferentes,	
  os	
  dejo	
  algunas.
•	
  if	
  (	
  typeof(Worker	
  )	
  !==	
  “undefined”)
•	
  if	
  (	
  !window.Worker	
  /	
  window.Worker	
  )
•	
  if	
  (Modernizr.webworkers	
  )
U6lizaré	
  un	
  operador	
  ternario	
  dentro	
  de	
  una	
  IIFE	
  para	
  mostrar	
  un	
  mensaje,después	
  haré	
  una	
  
segunda	
  comprobación	
  de	
  la	
  existencia	
  del	
  window.Worker	
  antes	
  de	
  crear	
  los	
  workers.
(func6on(){
var	
  c	
  =	
  "Tu	
  navegador	
  "	
  +	
  ((window.Worker)	
  ?	
  "soporta	
  web	
  workers"	
  :	
  "no	
  soporta	
  web	
  workers");
document.getElementById("compa6bilidad").innerHTML	
  =	
  c;
})();
07
8viernes 11 de octubre de 13
9viernes 11 de octubre de 13
Dedicated workers
Crear y detener workers
Creando	
  el	
  worker:	
  	
  var	
  worker	
  =	
  new	
  Worker(“workerAlpha.js”);
•	
  U6lizamos	
  la	
  función	
  Worker(URL).	
  
•	
  La	
  URL	
  corresponde	
  con	
  el	
  fichero	
  JavaScript	
  con	
  el	
  código	
  del	
  worker.	
  
•	
  Se	
  asigna	
  a	
  una	
  variable,	
  en	
  este	
  caso	
  worker.
¿Como	
  lo	
  detengo?
•Desde	
  el	
  propio	
  worker	
  :	
  self.close();
•Desde	
  fuera	
  del	
  worker	
  :	
  worker.terminate();
08
9viernes 11 de octubre de 13
10viernes 11 de octubre de 13
Comunicación con workers
Enviando mensajes
Los	
  web	
  workers,	
  se	
  comunican	
  mediante	
  el	
  paso	
  de	
  mensajes,	
  u6lizando	
  el	
  
evento	
  “MessageEvent".
El	
  “data”	
  o	
  información	
  enviada	
  entre	
  la	
  página	
  principal	
  y	
  el	
  worker	
  es	
  copiada,	
  
no	
  compar6da.	
  
Los	
  objetos	
  son	
  primeramente	
  serializados,	
  y,	
  posteriormente,	
  de-­‐serializados	
  en	
  
el	
  otro	
  lado	
  (	
  pagina	
  principal/	
  worker	
  )	
  .	
  
La	
  página	
  principal	
  y	
  el	
  worker	
  no	
  comparten	
  la	
  misma	
  instancia,	
  el	
  resultado	
  es	
  
que	
  se	
  crea	
  un	
  duplicado	
  en	
  cada	
  una	
  de	
  ellas,	
  la	
  mayoría	
  de	
  los	
  navegadores	
  
implementan	
  esta	
  caracterís6ca	
  como	
  “structured	
  clonning”.
09
10viernes 11 de octubre de 13
11viernes 11 de octubre de 13
Comunicación con workers
“structured clone” y serialización
El	
  algoritmo	
  "structured	
  clone"	
  es	
  un	
  nuevo	
  algoritmo	
  definido	
  por	
  la	
  
especificación	
  de	
  HTML	
  5	
  para	
  serializar	
  los	
  objetos	
  JavaScript	
  complejos.
La	
  serialización	
  es	
  el	
  proceso	
  de	
  conver6r	
  el	
  estado	
  de	
  un	
  objeto	
  en	
  un	
  formato	
  
que	
  se	
  pueda	
  almacenar	
  o	
  transportar.
El	
  complemento	
  de	
  serialización	
  es	
  deserialización,	
  que	
  convierte	
  una	
  secuencia	
  
en	
  un	
  objeto.
En	
  este	
  caso	
  se	
  u6liza	
  para	
  crear	
  un	
  nuevo	
  objeto	
  que	
  es	
  idén6co	
  en	
  todo	
  al	
  
original,	
  es	
  un	
  clon.	
  
10
11viernes 11 de octubre de 13
12viernes 11 de octubre de 13
Comunicación con workers
Enviando mensajes - Ejemplos
Enviamos	
  los	
  mensajes	
  con	
  la	
  función	
  postMessage()	
  haciendo	
  referencia	
  al	
  worker	
  o	
  
u6lizando	
  self	
  desde	
  el	
  propio	
  worker.
Podemos	
  enviar	
  strings,números,	
  valores	
  booleanos,	
  arrays,	
  objetos	
  javascript	
  y	
  json.
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  Ejemplos:
•worker.postMessage('Hola	
  Mundo');	
  
•self.postMessage(506);
•func6on	
  enviarMensaje(me){
	
  	
  	
  	
  	
  	
  worker.postMessage(me)
	
  	
  ;}
•worker.postMessage(personajes)
11
•var	
  personajes	
  =	
  [
{Nombre:	
  "Chuck"	
  ,	
  Apellido:	
  64},
{Nombre:	
  true	
  ,	
  Apellido:	
  "Grimes"},
{Nombre:	
  "Walter"	
  ,	
  Apellido:	
  "White"}
];
12viernes 11 de octubre de 13
13viernes 11 de octubre de 13
Comunicación con workers
Recibiendo mensajes
Tenemos que escuchar el evento “message”, tanto en el worker como el en
hilo principal.
Podemos utilizar un Listener:
•worker.addEventListener(“message”, function(){});
•self. addEventListener(“message”, function(){});
o directamente -> worker.onmessage:
•worker.onmessage = function (){};
•self.onmessage = function (){};
12
13viernes 11 de octubre de 13
14viernes 11 de octubre de 13
MessageEvent - data y timeStamp
Dentro	
  del	
  evento	
  MessageEvent,	
  nos	
  interesan	
  sobre	
  todo	
  el	
  data	
  y	
  el	
  
6meStamp:
•data:	
  con6ene	
  el	
  información	
  enviada.
•6meStamp:	
  con6ene	
  la	
  fecha	
  y	
  hora,	
  por	
  desgracia	
  en	
  un	
  formato	
  no	
  legible,	
  nos	
  
muestra	
  los	
  milisegundos	
  desde	
  1/1/1970	
  -­‐>	
  1381272453343	
  
Simplemente	
  creamos	
  un	
  nuevo	
  date,	
  u6lizando	
  el	
  6meStamp,	
  y	
  ya	
  podremos	
  
mostrar	
  la	
  información	
  de	
  una	
  forma	
  más	
  legible,	
  ademas	
  podremos	
  usar	
  los	
  
métodos	
  del	
  objeto	
  Date:	
  getDay,	
  getHours,getMonth,getSeconds,getFullYear...
var	
  fechaYhora	
  =	
  	
  new	
  Date(me.6meStamp);
13
14viernes 11 de octubre de 13
15viernes 11 de octubre de 13
JSON - stringify y parse
Los	
  Workers	
  6enen	
  soporte	
  para	
  JSON	
  y	
  por	
  lo	
  tanto	
  también	
  a	
  sus	
  métodos	
  
stringify()	
  y	
  parse().
Podéis	
  usar	
  el	
  método	
  parse()	
  para	
  ahorrar	
  6empo	
  al	
  “parsear”	
  objetos	
  JSON	
  string	
  
largos.	
  Un	
  worker	
  simple	
  para	
  hacer	
  esto	
  sería:
-­‐-­‐	
  >	
  parserWorker.js	
  <	
  -­‐-­‐
self.onmessage	
  =	
  func6on(me){
	
  	
  var	
  jsonString	
  =	
  me.data;
	
  	
  var	
  jsonObject	
  =	
  JSON.parse(jsonString);
	
  	
  self.postMessage(jsonObject);
};
14
15viernes 11 de octubre de 13
16viernes 11 de octubre de 13
Import Scripts
Los	
  workers	
  6enen	
  acceso	
  a	
  la	
  función	
  global	
  importScripts(),	
  la	
  cual	
  te	
  permite	
  
importar	
  scripts	
  o	
  librerías	
  dentro	
  de	
  su	
  scope,	
  acepta	
  como	
  parámetros	
  cero	
  o	
  
más	
  URIs
importScripts();	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
importScripts('script.js');	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
importScripts('libreria.js',	
  'cdn.js');	
  	
  
Los	
  scrips	
  se	
  ejecutan	
  en	
  el	
  orden	
  que	
  tu	
  estableces	
  y	
  se	
  hace	
  de	
  forma	
  síncrona,	
  
importScripts()	
  no	
  regresa	
  hasta	
  que	
  todos	
  los	
  scripts	
  se	
  hayan	
  cargado	
  y	
  ejecutado.
15
16viernes 11 de octubre de 13
17viernes 11 de octubre de 13
Inline Workers - 1/2
Vamos	
  a	
  crearlos	
  u6lizando	
  el	
  objeto	
  Blob(),	
  existe	
  otro	
  método	
  mediante	
  el	
  
BlobBuilder	
  pero	
  quedo	
  obsoleto	
  en	
  favor	
  del	
  objeto	
  Blob,	
  la	
  implementación	
  con	
  
este	
  úl6mo	
  es	
  mucho	
  más	
  clara.
Para	
  crear	
  un	
  inline	
  worker	
  necesitas	
  3	
  objetos:	
  el	
  worker,	
  el	
  Blob	
  y	
  el	
  Url.
1º-­‐	
  Primero	
  configuramos	
  el	
  inline	
  worker,	
  estableciendo	
  un	
  id	
  para	
  poder	
  acceder	
  
a	
  él	
  más	
  tarde,	
  le	
  ponemos	
  type=”app/worker”,	
  este	
  script	
  será	
  el	
  equivalente	
  a	
  un	
  
archivo	
  independiente	
  de	
  un	
  worker
<script	
  id="worker"	
  type="app/worker">
	
  	
  	
  	
  self.onmessage	
  =func6on(me)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  postMessage('Data:	
  '	
  +	
  me.data	
  );
	
  	
  	
  	
  };
</script>
16
17viernes 11 de octubre de 13
18viernes 11 de octubre de 13
Inline Workers - 2/2
2º	
  -­‐	
  Creamos	
  el	
  blob	
  (burbuja)
Creamos	
  la	
  burbuja	
  usando	
  el	
  objeto	
  Blob()	
  y	
  le	
  pasamos	
  el	
  contenido	
  del	
  script	
  
que	
  acabamos	
  de	
  crear,	
  debe	
  de	
  estar	
  en	
  un	
  array:
	
  var	
  blob	
  =	
  new	
  Blob([document.getElementById('worker').textContent]);
3º	
  -­‐	
  Creamos	
  la	
  url
Creamos	
  la	
  referencia	
  al	
  script	
  del	
  worker.
var	
  url	
  =	
  window.URL.createObjectURL(blob);
4º	
  -­‐	
  Instanciamos	
  el	
  Worker
Por	
  úl6mo,	
  instanciamos	
  un	
  nuevo	
  worker.	
  
Al	
  worker	
  le	
  pasamos	
  la	
  url	
  como	
  argumento.
var	
  worker	
  =	
  new	
  Worker(url);
17
18viernes 11 de octubre de 13
19viernes 11 de octubre de 13
Patrón Inline Worker
<body>
	
  	
  	
  	
  <script	
  id="worker"	
  type="app/worker">
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  self.onmessage	
  =func6on(me)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  postMessage(me);
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  };
	
  	
  	
  	
  </script>
	
  	
  	
  	
  <script>
	
  	
  	
  	
  	
  	
  	
  	
  func6on	
  inlineWorker()	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  blob	
  =	
  new	
  Blob([document.getElementById("	
  worker	
  ").textContent]),
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  url	
  	
  	
  	
  =	
  window.URL.createObjectURL(blob),
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  wor	
  	
  =	
  new	
  Worker(url);
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  wor.onmessage	
  =func6on(me)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  console.log();
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  };
	
  	
  	
  	
  	
  	
  	
  	
  wor.postMessage("	
  ");
	
  	
  	
  	
  	
  	
  	
  	
  };
	
  	
  	
  	
  	
  	
  	
  	
  window.onload	
  =	
  inlineWorker();
	
  	
  	
  	
  </script>
</body>
18
19viernes 11 de octubre de 13
20viernes 11 de octubre de 13
Shared Workers 1/3
Los	
  shared	
  workers	
  permiten	
  que	
  varios	
  scrips,	
  incluso	
  de	
  diferentes	
  
páginas,	
  se	
  conecten	
  de	
  forma	
  simultánea	
  al	
  mismo	
  sharedworker,	
  pero	
  
deben	
  respetar	
  el	
  “same	
  origin	
  policy”	
  es	
  decir,	
  mismo	
  protocolo,	
  mismo	
  
host	
  y	
  mismo	
  puerto.
Los	
  shared	
  workers	
  ademas	
  de	
  lo	
  ya	
  mencionado	
  en	
  los	
  anteriores	
  6pos	
  de	
  
workers,	
  6enen	
  el	
  atributo	
  “port”,	
  el	
  evento	
  “connect”	
  y	
  el	
  método	
  start()
1º-­‐	
  Primero	
  	
  vamos	
  a	
  crear	
  el	
  script	
  del	
  worker	
  y	
  una	
  variable	
  para	
  
controlar	
  a	
  los	
  clientes	
  que	
  se	
  van	
  conectando
var	
  cliente;
19
20viernes 11 de octubre de 13
21viernes 11 de octubre de 13
Shared Workers 2/3
2º	
  Creamos	
  un	
  listener	
  para	
  el	
  evento	
  connect
3º	
  Dentro	
  del	
  listener	
  del	
  connect,	
  vamos	
  a	
  guardar	
  el	
  puerto	
  en	
  una	
  variable
4º	
  Creamos	
  un	
  listener	
  para	
  el	
  evento	
  message	
  uPlizando	
  la	
  variable	
  port
5º	
  Ahora	
  creamos	
  el	
  port.postMessage	
  y	
  el	
  port.start();
self.addEventListener("connect",	
  func6on	
  (e)	
  {
	
  	
  	
  	
  var	
  port	
  =	
  e.ports[0];
	
  	
  	
  	
  cliente++;
	
  	
  	
  
	
  	
  	
  	
  port.addEventListener("message",	
  func6on	
  (me)	
  {
	
  	
  	
  	
  	
  	
  	
  port.postMessage("Puerto	
  #"	
  +	
  cliente);
	
  	
  	
  	
  });
	
  	
  	
  	
  port.start();
});
20
21viernes 11 de octubre de 13
22viernes 11 de octubre de 13
Shared Workers 3/3
6º-­‐	
  Finalmente	
  creamos	
  el	
  SharedWorker.
var	
  worker	
  =	
  new	
  SharedWorker("sharedworker.js");
El	
  resto	
  es	
  similar	
  a	
  los	
  casos	
  anteriores,	
  pero	
  recordad	
  agregar	
  el	
  “port”	
  en	
  el	
  
addEventListener(),	
  start(),	
  y	
  postMessage().
worker.port.addEventListener("message",	
  func6on(me)	
  {
	
  	
  console.log(me.data);
});
worker.port.start();
worker.port.postMessage("");
21
22viernes 11 de octubre de 13
23viernes 11 de octubre de 13
Patrón SharedWorker.js
var	
  cliente;
self.addEventListener("connect",	
  func6on	
  (e)	
  {
	
  	
  	
  	
  var	
  port	
  =	
  e.ports[0];
	
  	
  	
  	
  cliente++;
	
  	
  	
  	
  port.addEventListener("message",	
  func6on	
  (me)	
  {
	
  	
  	
  	
  	
  	
  	
  port.postMessage("Puerto	
  #"	
  +	
  cliente);
	
  	
  	
  	
  });
	
  	
  	
  	
  port.start();
},	
  );
22
23viernes 11 de octubre de 13
24viernes 11 de octubre de 13
Patrón SharedWorker.html
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  <script>
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  var	
  worker	
  =	
  new	
  SharedWorker("sharedWorker.js");
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  worker.port.addEventListener("message",	
  func6on(me)	
  {
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  console.log(me.data);
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  });
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  worker.port.start();
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  worker.port.postMessage("");
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  </script>
23
24viernes 11 de octubre de 13
25viernes 11 de octubre de 13
Gestión de errores
Para	
  lidiar	
  con	
  los	
  errores,	
  tenemos	
  el	
  
evento	
  “error”,	
  para	
  mirar	
  más	
  
detalladamente	
  los	
  errores,	
  podemos	
  usar:
•	
  filename	
  -­‐	
  Nombre	
  del	
  Archivo
•	
  lineno	
  	
  -­‐	
  La	
  linea	
  en	
  donde	
  ocurrió	
  el	
  error
•	
  message	
  -­‐	
  Descripción	
  del	
  error
24
25viernes 11 de octubre de 13
26viernes 11 de octubre de 13
Gestion de errores
worker.onerror	
  =	
  func8on	
  workerError(error)	
  {
	
  	
  	
  	
  console.log(error);
}
worker.addEventListener('error',	
  func8on(error){
	
  	
  	
  	
  console.log('	
  Error	
  en	
  archivo:	
  '+error.filename
	
  	
  	
  	
  	
  	
  	
  	
  +	
  'n	
  Linea:	
  '+error.lineno
	
  	
  	
  	
  	
  	
  	
  	
  +	
  'n	
  Mensaje:	
  '+error.message);
});
//	
  Sin	
  tener	
  x	
  definida
self.postMessage(x);	
  
25
26viernes 11 de octubre de 13
27viernes 11 de octubre de 13
Gracias	
  por	
  vuestra	
  atención
Ejemplos de web workers:
HTTPS://DEVELOPER.MOZILLA.ORG/MS/DEMOS/TAG/TECH:WEBWORKERS
NachoVeiga @VeigaNacho
27viernes 11 de octubre de 13

Más contenido relacionado

Destacado

Programa DCO - Desarrollo de competencias organizacionales en UCEMA
Programa DCO  - Desarrollo de competencias organizacionales en UCEMAPrograma DCO  - Desarrollo de competencias organizacionales en UCEMA
Programa DCO - Desarrollo de competencias organizacionales en UCEMA
Ignacio Bossi
 
Curso superación personal
Curso superación personalCurso superación personal
Curso superación personal
Juan Ignacio B.
 
INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...
INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...
INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...
jefercordoba
 

Destacado (20)

Mindful Eye - Apuntes del taller introductorio
Mindful Eye  - Apuntes del taller introductorioMindful Eye  - Apuntes del taller introductorio
Mindful Eye - Apuntes del taller introductorio
 
Curso Mindfulness MBSR - Silvio Raij
Curso Mindfulness MBSR - Silvio RaijCurso Mindfulness MBSR - Silvio Raij
Curso Mindfulness MBSR - Silvio Raij
 
4 Level SAFe
4 Level SAFe4 Level SAFe
4 Level SAFe
 
Programa Mindfulness para Empresas
Programa Mindfulness para EmpresasPrograma Mindfulness para Empresas
Programa Mindfulness para Empresas
 
Programa DCO - Desarrollo de competencias organizacionales en UCEMA
Programa DCO  - Desarrollo de competencias organizacionales en UCEMAPrograma DCO  - Desarrollo de competencias organizacionales en UCEMA
Programa DCO - Desarrollo de competencias organizacionales en UCEMA
 
Meditación
MeditaciónMeditación
Meditación
 
Alto Rendimiento y Bienestar
Alto Rendimiento y BienestarAlto Rendimiento y Bienestar
Alto Rendimiento y Bienestar
 
Curso superación personal
Curso superación personalCurso superación personal
Curso superación personal
 
Mental Health in the Workplace: The Legal Challenge
Mental Health in the Workplace: The Legal ChallengeMental Health in the Workplace: The Legal Challenge
Mental Health in the Workplace: The Legal Challenge
 
Mindfulness
MindfulnessMindfulness
Mindfulness
 
Mindful leading conferencia sport culturabcn_esade
Mindful leading conferencia sport culturabcn_esadeMindful leading conferencia sport culturabcn_esade
Mindful leading conferencia sport culturabcn_esade
 
Design Livre e Cultura Colaborativa
Design Livre e Cultura ColaborativaDesign Livre e Cultura Colaborativa
Design Livre e Cultura Colaborativa
 
Curso Supera el Estres con Mindfulness e Inteligencia Emocional
Curso Supera el Estres con Mindfulness e Inteligencia EmocionalCurso Supera el Estres con Mindfulness e Inteligencia Emocional
Curso Supera el Estres con Mindfulness e Inteligencia Emocional
 
Creatividad y mindfulness
Creatividad y mindfulnessCreatividad y mindfulness
Creatividad y mindfulness
 
Taller Mindfulness18 12-2014- Dr. Campayo
Taller Mindfulness18 12-2014- Dr. CampayoTaller Mindfulness18 12-2014- Dr. Campayo
Taller Mindfulness18 12-2014- Dr. Campayo
 
INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...
INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...
INFORMACIÓN GUÍA DE: YOGA Y MEDITACIÓN Y SUS BENEFICIO. ILUMINACIÓN MANTRAS M...
 
Mindfulness en el trabajo con Grupo P&A Consultores -Vigo
Mindfulness en el trabajo con Grupo P&A Consultores -VigoMindfulness en el trabajo con Grupo P&A Consultores -Vigo
Mindfulness en el trabajo con Grupo P&A Consultores -Vigo
 
Beneficios del mindfulness Jornadas Adapa
Beneficios del mindfulness Jornadas AdapaBeneficios del mindfulness Jornadas Adapa
Beneficios del mindfulness Jornadas Adapa
 
Mindful Wellness Program
Mindful Wellness ProgramMindful Wellness Program
Mindful Wellness Program
 
Neurociencia Aplicada
Neurociencia AplicadaNeurociencia Aplicada
Neurociencia Aplicada
 

Similar a Web Workers

Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
Dani Latorre
 
Ajax
AjaxAjax
Ajax
utpl
 
Servlets y jsp
Servlets y jspServlets y jsp
Servlets y jsp
dtbadboy0
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
Ian Monge Pérez
 

Similar a Web Workers (20)

AJAX EN CURSO PHP
AJAX EN CURSO PHPAJAX EN CURSO PHP
AJAX EN CURSO PHP
 
Un poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernesUn poco más allá con grails. PrimerViernes
Un poco más allá con grails. PrimerViernes
 
expo
expoexpo
expo
 
Ajax
AjaxAjax
Ajax
 
Javascript en proyectos reales: jQuery
Javascript en proyectos reales: jQueryJavascript en proyectos reales: jQuery
Javascript en proyectos reales: jQuery
 
Ajax
AjaxAjax
Ajax
 
Iron workers y javascript
Iron workers y javascriptIron workers y javascript
Iron workers y javascript
 
Dar lab1819
Dar lab1819Dar lab1819
Dar lab1819
 
Ajax
AjaxAjax
Ajax
 
Inicios Ajax
Inicios AjaxInicios Ajax
Inicios Ajax
 
Ajax
AjaxAjax
Ajax
 
01 Ext Js Introduccion
01 Ext Js   Introduccion01 Ext Js   Introduccion
01 Ext Js Introduccion
 
CrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NETCrossDvlpu - REACT para desarrolladores de ASP.NET
CrossDvlpu - REACT para desarrolladores de ASP.NET
 
Cross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.netCross development - React para desarrolladores de asp.net
Cross development - React para desarrolladores de asp.net
 
servlets
servlets servlets
servlets
 
Proyecto Avatar - JavaScript sobre la JVM del servidor
Proyecto Avatar - JavaScript sobre la JVM del servidorProyecto Avatar - JavaScript sobre la JVM del servidor
Proyecto Avatar - JavaScript sobre la JVM del servidor
 
Web workers
Web workersWeb workers
Web workers
 
Servlets y jsp
Servlets y jspServlets y jsp
Servlets y jsp
 
Mootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JSMootools Y Otros Frameworks JS
Mootools Y Otros Frameworks JS
 
Servicios web
Servicios webServicios web
Servicios web
 

Web Workers

  • 1. 1viernes 11 de octubre de 13
  • 2. HTML5 WEB WORKERS Dedicated  Workers Inline  Workers Shared  Workers NachoVeiga @VeigaNacho 1viernes 11 de octubre de 13
  • 3. 2viernes 11 de octubre de 13
  • 4. Características • Añade la capacidad de procesar scripts en el background de las aplicaciones web. 2viernes 11 de octubre de 13
  • 5. Características • Añade la capacidad de procesar scripts en el background de las aplicaciones web. • Cada worker tiene su propio hilo de ejecución. 2viernes 11 de octubre de 13
  • 6. Características • Añade la capacidad de procesar scripts en el background de las aplicaciones web. • Cada worker tiene su propio hilo de ejecución. • Sacan partido de los procesadores multi-núcleo. 2viernes 11 de octubre de 13
  • 7. Características • Añade la capacidad de procesar scripts en el background de las aplicaciones web. • Cada worker tiene su propio hilo de ejecución. • Sacan partido de los procesadores multi-núcleo. • Permiten separar tareas pesadas, evitando la aparición de ventanas molestas “Unresponsive script” debido al tiempo de ejecución. 01 2viernes 11 de octubre de 13
  • 8. 3viernes 11 de octubre de 13
  • 9. Javascript - Web Workers 02 3viernes 11 de octubre de 13
  • 10. 4viernes 11 de octubre de 13
  • 11. Web Workers vs Node + Web Sockets La ventaja más evidente es la velocidad, los web workers son más rápidos. Node.js se ejecuta desde un servidor mientras que los workers están en el navegador, lo cual hace, por norma general, que sean más rápidos. Además, Node necesita su propio servidor lo cual supone un coste extra al proyecto, tanto monetario como de trabajo. También tienen a su favor que los workers aprovechan el potencial de los procesadores multi- núcleo, como ya comentamos, aunque esto puede ser un problema ya que eventualmente pueden requerir más recursos de los que posees, utilizar toda la ram... utilizad 10 workers como máximo, esto ya sería un poder tremendo. Un factor a tener en cuenta hoy en día son los dispositivos móviles (tablets y móviles), si utilizáis HTML5 Web Workers + Animaciones CSS3 + JS deberéis probar vuestra aplicación web en diferentes dispositivos para ver si funciona correctamente y fluido. 03 4viernes 11 de octubre de 13
  • 12. 5viernes 11 de octubre de 13
  • 13. Limitaciones Los  Web  Workers  no  trabajan  en  el  contexto  global  de  la  ventana  del   navegador,  por  lo  tanto  no  6enen  acceso  a: •  El  objeto  window •  El  objeto  document •  El  objeto  console •  El  objeto  parent •  Y  tampoco  pueden  usar  librerías  que  dependan  de  estos,   adiós  Jquery,Prototype... 04 5viernes 11 de octubre de 13
  • 14. 6viernes 11 de octubre de 13
  • 15. ¿A que tienen acceso? Debido  a  su  naturaleza  mul6-­‐hilo,  solo  6enen  acceso  a  algunas  de  las   caracterís6cas  de  Javascript,  os  dejo  una  lista: • El objeto navigator • El objeto location ( solo lectura ) • La función XMLHttpRequest (Ajax) • setTimeout() / clearTimeout() y setInterval() / clearInterval() • Cache • Importar scripts usando el método importScripts() • Web Sockets • Web SQL Databases • Web Workers 05 6viernes 11 de octubre de 13
  • 16. 7viernes 11 de octubre de 13
  • 18. 8viernes 11 de octubre de 13
  • 19. Comprobando la compatibilidad Existen  muchas  formas  diferentes,  os  dejo  algunas. •  if  (  typeof(Worker  )  !==  “undefined”) •  if  (  !window.Worker  /  window.Worker  ) •  if  (Modernizr.webworkers  ) U6lizaré  un  operador  ternario  dentro  de  una  IIFE  para  mostrar  un  mensaje,después  haré  una   segunda  comprobación  de  la  existencia  del  window.Worker  antes  de  crear  los  workers. (func6on(){ var  c  =  "Tu  navegador  "  +  ((window.Worker)  ?  "soporta  web  workers"  :  "no  soporta  web  workers"); document.getElementById("compa6bilidad").innerHTML  =  c; })(); 07 8viernes 11 de octubre de 13
  • 20. 9viernes 11 de octubre de 13
  • 21. Dedicated workers Crear y detener workers Creando  el  worker:    var  worker  =  new  Worker(“workerAlpha.js”); •  U6lizamos  la  función  Worker(URL).   •  La  URL  corresponde  con  el  fichero  JavaScript  con  el  código  del  worker.   •  Se  asigna  a  una  variable,  en  este  caso  worker. ¿Como  lo  detengo? •Desde  el  propio  worker  :  self.close(); •Desde  fuera  del  worker  :  worker.terminate(); 08 9viernes 11 de octubre de 13
  • 22. 10viernes 11 de octubre de 13
  • 23. Comunicación con workers Enviando mensajes Los  web  workers,  se  comunican  mediante  el  paso  de  mensajes,  u6lizando  el   evento  “MessageEvent". El  “data”  o  información  enviada  entre  la  página  principal  y  el  worker  es  copiada,   no  compar6da.   Los  objetos  son  primeramente  serializados,  y,  posteriormente,  de-­‐serializados  en   el  otro  lado  (  pagina  principal/  worker  )  .   La  página  principal  y  el  worker  no  comparten  la  misma  instancia,  el  resultado  es   que  se  crea  un  duplicado  en  cada  una  de  ellas,  la  mayoría  de  los  navegadores   implementan  esta  caracterís6ca  como  “structured  clonning”. 09 10viernes 11 de octubre de 13
  • 24. 11viernes 11 de octubre de 13
  • 25. Comunicación con workers “structured clone” y serialización El  algoritmo  "structured  clone"  es  un  nuevo  algoritmo  definido  por  la   especificación  de  HTML  5  para  serializar  los  objetos  JavaScript  complejos. La  serialización  es  el  proceso  de  conver6r  el  estado  de  un  objeto  en  un  formato   que  se  pueda  almacenar  o  transportar. El  complemento  de  serialización  es  deserialización,  que  convierte  una  secuencia   en  un  objeto. En  este  caso  se  u6liza  para  crear  un  nuevo  objeto  que  es  idén6co  en  todo  al   original,  es  un  clon.   10 11viernes 11 de octubre de 13
  • 26. 12viernes 11 de octubre de 13
  • 27. Comunicación con workers Enviando mensajes - Ejemplos Enviamos  los  mensajes  con  la  función  postMessage()  haciendo  referencia  al  worker  o   u6lizando  self  desde  el  propio  worker. Podemos  enviar  strings,números,  valores  booleanos,  arrays,  objetos  javascript  y  json.                                                                                                                                    Ejemplos: •worker.postMessage('Hola  Mundo');   •self.postMessage(506); •func6on  enviarMensaje(me){            worker.postMessage(me)    ;} •worker.postMessage(personajes) 11 •var  personajes  =  [ {Nombre:  "Chuck"  ,  Apellido:  64}, {Nombre:  true  ,  Apellido:  "Grimes"}, {Nombre:  "Walter"  ,  Apellido:  "White"} ]; 12viernes 11 de octubre de 13
  • 28. 13viernes 11 de octubre de 13
  • 29. Comunicación con workers Recibiendo mensajes Tenemos que escuchar el evento “message”, tanto en el worker como el en hilo principal. Podemos utilizar un Listener: •worker.addEventListener(“message”, function(){}); •self. addEventListener(“message”, function(){}); o directamente -> worker.onmessage: •worker.onmessage = function (){}; •self.onmessage = function (){}; 12 13viernes 11 de octubre de 13
  • 30. 14viernes 11 de octubre de 13
  • 31. MessageEvent - data y timeStamp Dentro  del  evento  MessageEvent,  nos  interesan  sobre  todo  el  data  y  el   6meStamp: •data:  con6ene  el  información  enviada. •6meStamp:  con6ene  la  fecha  y  hora,  por  desgracia  en  un  formato  no  legible,  nos   muestra  los  milisegundos  desde  1/1/1970  -­‐>  1381272453343   Simplemente  creamos  un  nuevo  date,  u6lizando  el  6meStamp,  y  ya  podremos   mostrar  la  información  de  una  forma  más  legible,  ademas  podremos  usar  los   métodos  del  objeto  Date:  getDay,  getHours,getMonth,getSeconds,getFullYear... var  fechaYhora  =    new  Date(me.6meStamp); 13 14viernes 11 de octubre de 13
  • 32. 15viernes 11 de octubre de 13
  • 33. JSON - stringify y parse Los  Workers  6enen  soporte  para  JSON  y  por  lo  tanto  también  a  sus  métodos   stringify()  y  parse(). Podéis  usar  el  método  parse()  para  ahorrar  6empo  al  “parsear”  objetos  JSON  string   largos.  Un  worker  simple  para  hacer  esto  sería: -­‐-­‐  >  parserWorker.js  <  -­‐-­‐ self.onmessage  =  func6on(me){    var  jsonString  =  me.data;    var  jsonObject  =  JSON.parse(jsonString);    self.postMessage(jsonObject); }; 14 15viernes 11 de octubre de 13
  • 34. 16viernes 11 de octubre de 13
  • 35. Import Scripts Los  workers  6enen  acceso  a  la  función  global  importScripts(),  la  cual  te  permite   importar  scripts  o  librerías  dentro  de  su  scope,  acepta  como  parámetros  cero  o   más  URIs importScripts();                                               importScripts('script.js');                               importScripts('libreria.js',  'cdn.js');     Los  scrips  se  ejecutan  en  el  orden  que  tu  estableces  y  se  hace  de  forma  síncrona,   importScripts()  no  regresa  hasta  que  todos  los  scripts  se  hayan  cargado  y  ejecutado. 15 16viernes 11 de octubre de 13
  • 36. 17viernes 11 de octubre de 13
  • 37. Inline Workers - 1/2 Vamos  a  crearlos  u6lizando  el  objeto  Blob(),  existe  otro  método  mediante  el   BlobBuilder  pero  quedo  obsoleto  en  favor  del  objeto  Blob,  la  implementación  con   este  úl6mo  es  mucho  más  clara. Para  crear  un  inline  worker  necesitas  3  objetos:  el  worker,  el  Blob  y  el  Url. 1º-­‐  Primero  configuramos  el  inline  worker,  estableciendo  un  id  para  poder  acceder   a  él  más  tarde,  le  ponemos  type=”app/worker”,  este  script  será  el  equivalente  a  un   archivo  independiente  de  un  worker <script  id="worker"  type="app/worker">        self.onmessage  =func6on(me)  {                postMessage('Data:  '  +  me.data  );        }; </script> 16 17viernes 11 de octubre de 13
  • 38. 18viernes 11 de octubre de 13
  • 39. Inline Workers - 2/2 2º  -­‐  Creamos  el  blob  (burbuja) Creamos  la  burbuja  usando  el  objeto  Blob()  y  le  pasamos  el  contenido  del  script   que  acabamos  de  crear,  debe  de  estar  en  un  array:  var  blob  =  new  Blob([document.getElementById('worker').textContent]); 3º  -­‐  Creamos  la  url Creamos  la  referencia  al  script  del  worker. var  url  =  window.URL.createObjectURL(blob); 4º  -­‐  Instanciamos  el  Worker Por  úl6mo,  instanciamos  un  nuevo  worker.   Al  worker  le  pasamos  la  url  como  argumento. var  worker  =  new  Worker(url); 17 18viernes 11 de octubre de 13
  • 40. 19viernes 11 de octubre de 13
  • 41. Patrón Inline Worker <body>        <script  id="worker"  type="app/worker">                                self.onmessage  =func6on(me)  {                                postMessage(me);                        };        </script>        <script>                func6on  inlineWorker()  {                        var  blob  =  new  Blob([document.getElementById("  worker  ").textContent]),                                      url        =  window.URL.createObjectURL(blob),                                      wor    =  new  Worker(url);                                                wor.onmessage  =func6on(me)  {                        console.log();                        };                wor.postMessage("  ");                };                window.onload  =  inlineWorker();        </script> </body> 18 19viernes 11 de octubre de 13
  • 42. 20viernes 11 de octubre de 13
  • 43. Shared Workers 1/3 Los  shared  workers  permiten  que  varios  scrips,  incluso  de  diferentes   páginas,  se  conecten  de  forma  simultánea  al  mismo  sharedworker,  pero   deben  respetar  el  “same  origin  policy”  es  decir,  mismo  protocolo,  mismo   host  y  mismo  puerto. Los  shared  workers  ademas  de  lo  ya  mencionado  en  los  anteriores  6pos  de   workers,  6enen  el  atributo  “port”,  el  evento  “connect”  y  el  método  start() 1º-­‐  Primero    vamos  a  crear  el  script  del  worker  y  una  variable  para   controlar  a  los  clientes  que  se  van  conectando var  cliente; 19 20viernes 11 de octubre de 13
  • 44. 21viernes 11 de octubre de 13
  • 45. Shared Workers 2/3 2º  Creamos  un  listener  para  el  evento  connect 3º  Dentro  del  listener  del  connect,  vamos  a  guardar  el  puerto  en  una  variable 4º  Creamos  un  listener  para  el  evento  message  uPlizando  la  variable  port 5º  Ahora  creamos  el  port.postMessage  y  el  port.start(); self.addEventListener("connect",  func6on  (e)  {        var  port  =  e.ports[0];        cliente++;              port.addEventListener("message",  func6on  (me)  {              port.postMessage("Puerto  #"  +  cliente);        });        port.start(); }); 20 21viernes 11 de octubre de 13
  • 46. 22viernes 11 de octubre de 13
  • 47. Shared Workers 3/3 6º-­‐  Finalmente  creamos  el  SharedWorker. var  worker  =  new  SharedWorker("sharedworker.js"); El  resto  es  similar  a  los  casos  anteriores,  pero  recordad  agregar  el  “port”  en  el   addEventListener(),  start(),  y  postMessage(). worker.port.addEventListener("message",  func6on(me)  {    console.log(me.data); }); worker.port.start(); worker.port.postMessage(""); 21 22viernes 11 de octubre de 13
  • 48. 23viernes 11 de octubre de 13
  • 49. Patrón SharedWorker.js var  cliente; self.addEventListener("connect",  func6on  (e)  {        var  port  =  e.ports[0];        cliente++;        port.addEventListener("message",  func6on  (me)  {              port.postMessage("Puerto  #"  +  cliente);        });        port.start(); },  ); 22 23viernes 11 de octubre de 13
  • 50. 24viernes 11 de octubre de 13
  • 51. Patrón SharedWorker.html                    <script>                    var  worker  =  new  SharedWorker("sharedWorker.js");                    worker.port.addEventListener("message",  func6on(me)  {                        console.log(me.data);                    });                    worker.port.start();                    worker.port.postMessage("");                    </script> 23 24viernes 11 de octubre de 13
  • 52. 25viernes 11 de octubre de 13
  • 53. Gestión de errores Para  lidiar  con  los  errores,  tenemos  el   evento  “error”,  para  mirar  más   detalladamente  los  errores,  podemos  usar: •  filename  -­‐  Nombre  del  Archivo •  lineno    -­‐  La  linea  en  donde  ocurrió  el  error •  message  -­‐  Descripción  del  error 24 25viernes 11 de octubre de 13
  • 54. 26viernes 11 de octubre de 13
  • 55. Gestion de errores worker.onerror  =  func8on  workerError(error)  {        console.log(error); } worker.addEventListener('error',  func8on(error){        console.log('  Error  en  archivo:  '+error.filename                +  'n  Linea:  '+error.lineno                +  'n  Mensaje:  '+error.message); }); //  Sin  tener  x  definida self.postMessage(x);   25 26viernes 11 de octubre de 13
  • 56. 27viernes 11 de octubre de 13
  • 57. Gracias  por  vuestra  atención Ejemplos de web workers: HTTPS://DEVELOPER.MOZILLA.ORG/MS/DEMOS/TAG/TECH:WEBWORKERS NachoVeiga @VeigaNacho 27viernes 11 de octubre de 13