Acerca de mi

Soy Javier Ferrer González.

Actualmente trabajo como desarrollador web backend en Uvinum, estoy finalizando el Grado en Ingeniería Informática en la FIB-UPC y doy clases en el Máster de Programación Web de Alto Rendimiento de LaSalle BCN.

En este blog encontrarás posts sobre internet, programación y reflexiones variadas.

Si quieres saber más acerca de mi, aquí tienes mi Currículum y el formulario de contacto.
Acerca de mi

Paralelizar aplicaciones web

A día de hoy podemos decir que los dispositivos con múltiples núcleos están más que extendidos. Partiendo de esta base es lógico que, como desarrolladores, nos planteemos qué podemos hacer para explotar estas características y no relegar todo a “los oscuros mundos” de la implementación a bajo nivel.

En lenguajes como C o C++ disponemos de OpenMP, una API a base de #pragmas muy bien parida. Ultimamente he tenido que tratar bastante con ella y no descarto escribir algunos ejemplos concretos más adelante, pero antes quería analizar el ecosistema web en este sentido. ¿Podemos paralelizar aplicaciones web?

¿Qué significa paralelizar una aplicación?

Paralelizar una aplicación se reduce a aislar ciertas funciones en procesos que no dependan los unos de los otros, de tal forma que se puedan ejecutar todos ellos a la vez, logrando así reducir el tiempo de ejecución de estas funciones y, por lo tanto, de nuestra aplicación.

Análisis de paralelización

Análisis de paralelización

Gestión de tareas

Antes de continuar, creo conveniente marcar una clara diferenciación entre la gestión de tareas y la programación paralela.

A día de hoy tenemos sistemas de gestión de colas de trabajo, paradigmas diferentes a lo que previamente definíamos como paralelización. En este sentido tenemos desde la programación de tareas rutinarias mediante Crons, hasta sistemas más avanzados, los cuales nos permitirían la gestión dinámica y asíncrona de colas de trabajo mediante paso de mensajes como beanstalkd, RabbitMQAmazon SQS.

Paralelización “a medias” en PHP con pcntl_fork()

Aquí tenemos un ejemplo de creación de hilos en PHP, la implementación se antoja un tanto compleja, y además, probablemente no estaríamos aprovechando todo el potencial de la arquitectura, ya que lo que estamos haciendo es crear 10 hilos, indistintamente de si nuestro sistema es capaz de ejecutar paralelamente 4 como 48. Así entonces, en última instancia y a pesar de ser cierto que estaríamos paralelizando nuestra aplicación, no tendríamos toda la ganancia que podríamos tener.

Por último, lo más importante acerca de esta técnica es lo que señalan en este hilo de StackOverflow acerca de la función pcntl_fork. Esta sentencia supone la creación de un nuevo proceso hijo, tal y como lo haríamos en C, y por lo tanto, gestionado como cualquier otro proceso en UNIX, con lo que esta técnica no debería llevarse a cabo en entornos web ya que podríamos obtener resultados inesperados (por lo tanto, quedaría reservada a la ejecución de scripts PHP desde consola).

Paralelización independiente de la arquitectura

De lo anterior podemos deducir entonces que lo óptimo sería disponer de herramientas como OpenMP, donde simplemente le indicaríamos al compilador que esa región de tu algoritmo se puede ejecutar de forma paralela, desentendiéndonos así la creación y gestión de los hilos.

Lo que conseguimos así es que nuestra aplicación, sin necesidad de modificación alguna, pueda aprovechar los posteriores avances a nivel de arquitectura, ya que si a día de hoy hablamos del código secuencial como una técnica “obsoleta”, qué sentido tiene pensar en una aplicación que ejecuta dos únicos hilos en un equipo capaz de ejecutar 128?

El futuro de PHP: pthreads

A pesar de que no está ni en las versiones más tempranas del lenguaje, entre la documentación de php encontramos la API pthreads, orientada a objetos y con la intención de ser compatible con la ejecución de PHP desde entornos web (Apache & Co.).

No obstante, tal y como lo definen en su introducción, pthreads es un experimento con excelentes resultados, pero como experimento que es, puede sufrir cambios en cualquier momento, con lo cual, habrá que dejarlo madurar 🙂

Paralelización en JavaScript

Algo que aporta bastante luz al tema, es el desarrollo que ha llevado a cabo Intel para JavaScript. Conceptualmente se basa en un objeto de tipo ParallelArray, al cuál le podéis echar un ojo en un ejemplo que han colgado en GitHub.

Conclusión

Es normal que el soporte a nivel de desarrollo web vaya por detrás de los avances técnicos y de lenguajes más cercanos a esos oscuros mundos que decíamos al principio, pero lo que está claro es que hay una clara diferencia en el tiempo y esto puede ser por una sencilla razón: A pesar del potencial de este tipo de paradigmas de programación, para aplicaciones web comunes no serían tan necesarios.

Después del tostón de post, que llegue a esta conclusión quizás puede parecer chocante, así que aclaro ciertos matices:

  • Nadie duda del coste que pueden tener ciertos procesos de aplicaciones web a gran escala o de gran demanda, pero hasta el momento lo hemos sabido suplir con soluciones alternativas como las que se comentaban en el punto de gestión de tareas.
  • Dejando de lado este tipo de webs, la mayoría de webs no tienen un coste computacional tan elevado como para hacer latente la necesidad de este tipo de avances, con lo que es algo que “no corre tanta prisa” implementar así como sí pasaría en otros lenguajes más orientados a otros entornos.
  • A pesar de los dos puntos anteriores, es innegable que innumerables aplicaciones web se podrían beneficiar de este tipo de avances, e incluso abrirían la puerta a aplicaciones más complejas, con lo que bienvenidos sean todos los avances, tanto los de PHP con pthreads como los de Intel y su ParallelArray para JavaScript.
Share this Story

Posts relacionados

1 Comentario

  1. […] y del que hay relativamente poco material en internet, con lo que, como ya avancé en el análisis de las posibilidades de paralelización en PHP y JavaScript, voy a intentar dedicarle una serie de […]

    Responder

Deja un comentario

Subscríbete por email

Recibe las noticias que se publiquen en tu buzón:

Google+

Facebook