{"id":876,"date":"2025-03-18T09:00:00","date_gmt":"2025-03-18T09:00:00","guid":{"rendered":"https:\/\/cloudlab.urv.cat\/catedracloud\/?p=876"},"modified":"2025-02-14T22:46:38","modified_gmt":"2025-02-14T22:46:38","slug":"portando-tu-aplicacion-a-serverless-en-5-segundos-con-lithops","status":"publish","type":"post","link":"https:\/\/cloudlab.urv.cat\/catedracloud\/2025\/03\/18\/portando-tu-aplicacion-a-serverless-en-5-segundos-con-lithops\/","title":{"rendered":"Portando tu aplicaci\u00f3n a serverless en 5 segundos con Lithops"},"content":{"rendered":"\n<p>Imagina que tienes una aplicaci\u00f3n o programa en Python dise\u00f1ado para ejecutarse localmente, pero te gustar\u00eda portarlo a la computaci\u00f3n serverless. \u00bfC\u00f3mo lo har\u00edas? \u00bfCu\u00e1les ser\u00edan los pasos a seguir? \u00bfQu\u00e9 desaf\u00edos encontrar\u00edas en el camino? Veamos c\u00f3mo Lithops puede ayudarte en este proceso.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Recapitulando<\/strong><\/h2>\n\n\n\n<p>En un <a href=\"https:\/\/cloudlab.urv.cat\/catedracloud\/2025\/01\/18\/la-transparencia-en-los-sistemas-distribuidos\/\" data-type=\"post\" data-id=\"658\">art\u00edculo anterior<\/a>, hablamos sobre el concepto de transparencia en sistemas distribuidos. Vimos qu\u00e9 tipos de transparencia existen, cu\u00e1les son sus caracter\u00edsticas, su importancia y ejemplos pr\u00e1cticos. Por otro lado, en <a href=\"https:\/\/cloudlab.urv.cat\/catedracloud\/2025\/02\/18\/escapando-del-vendor-lock-in-lithops-al-rescate\/\" data-type=\"link\" data-id=\"https:\/\/cloudlab.urv.cat\/catedracloud\/2025\/02\/18\/escapando-del-vendor-lock-in-lithops-al-rescate\/\">otro art\u00edculo<\/a>, presentamos la herramienta Lithops y c\u00f3mo nos permit\u00eda ejecutar aplicaciones serverless de forma unificada entre distintos proveedores de cloud, evitando as\u00ed el vendor lock-in. Hoy presentaremos una funcionalidad de Lithops que nos permite portar aplicaciones a la computaci\u00f3n serverless de forma sencilla, r\u00e1pida y transparente.<br><\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Idea principal<\/strong><\/h2>\n\n\n\n<p>La programaci\u00f3n paralela en Python ha sido tradicionalmente implementada sobre la base de la librer\u00eda <em><code>multiprocessing<\/code><\/em>. Esta librer\u00eda contiene una serie de clases y abstracciones que permiten la creaci\u00f3n de m\u00faltiples procesos que se ejecutan de forma concurrente, as\u00ed como tambi\u00e9n la comunicaci\u00f3n y sincronizaci\u00f3n entre ellos. Por ejemplo, <em><code>multiprocessing<\/code><\/em> nos ofrece la abstracci\u00f3n de <em><code>Pool<\/code><\/em>, que nos permite crear un conjunto de procesos que ejecutan una funci\u00f3n en paralelo y nos devuelve los resultados de cada proceso. A nivel de estructuras de datos, disponemos de <em><code>Queue<\/code><\/em>, que nos permite compartir datos entre procesos de forma segura, o <em><code>Pipe<\/code><\/em>, que nos permite comunicar dos procesos entre s\u00ed.<\/p>\n\n\n\n<p>Este alto nivel de abstracci\u00f3n sobre los procesos y su comunicaci\u00f3n nos permite implementar la interfaz de esta librer\u00eda sobre Lithops. De este modo, las aplicaciones que est\u00e9n implementadas sobre <em><code>multiprocessing<\/code><\/em> pueden ser ejecutadas en serverless, a pesar de haber sido programadas para ejecutarse localmente. Obteniendo as\u00ed los beneficios de la computaci\u00f3n serverless, como por ejemplo, su gran escalabilidad o su pago por uso.<\/p>\n\n\n\n<p>Este fue el resultado de uno de los <a href=\"https:\/\/doi.org\/10.1016\/j.future.2022.10.038\">art\u00edculos cient\u00edficos<\/a> publicados por el grupo de investigaci\u00f3n <a href=\"https:\/\/cloudlab-urv.github.io\/WebCloudlab\/\">CloudLab<\/a>, en el que se evaluaba la transparencia de acceso en funciones serverless sobre la API de <em><code>multiprocessing<\/code><\/em>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Introducci\u00f3n a la API de multiprocessing<\/strong><\/h2>\n\n\n\n<p>La API de <code>multiprocessing<\/code> en Python proporciona una interfaz sencilla para crear y gestionar procesos. Algunas de las clases y funciones m\u00e1s utilizadas incluyen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>Process<\/code>: Permite crear un nuevo proceso.<\/li>\n\n\n\n<li><code>Pool<\/code>: Permite crear un grupo de procesos para ejecutar tareas en paralelo.<\/li>\n\n\n\n<li><code>Queue<\/code>: Proporciona una cola segura para compartir datos entre procesos.<\/li>\n\n\n\n<li><code>Pipe<\/code>: Permite la comunicaci\u00f3n entre dos procesos.<\/li>\n<\/ul>\n\n\n\n<p>A continuaci\u00f3n, se muestra un ejemplo b\u00e1sico de c\u00f3mo utilizar <code>multiprocessing<\/code> para ejecutar una funci\u00f3n en paralelo utilizando <code>Pool<\/code>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>import multiprocessing as mp\n\ndef square(x):\n    return x * x\n\nif __name__ == \"__main__\":\n    with mp.Pool(processes=4) as pool:\n        results = pool.map(square, range(10))\n    print(results)<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Lithops multiprocessing<\/strong><\/h2>\n\n\n\n<p>Como Lithops implementa esta misma API, podemos ejecutar el mismo c\u00f3digo anterior sobre serverless cambiando solo una l\u00ednea de c\u00f3digo, en particular la importaci\u00f3n de la librer\u00eda:<br><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from lithops import multiprocessing as mp<\/code><\/pre>\n\n\n\n<p>El resto del c\u00f3digo permanece inalterado, lo que nos permite portar aplicaciones a serverless de forma sencilla y transparente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>from lithops import multiprocessing as mp\n\ndef square(x):\n    return x * x\n\nif __name__ == \"__main__\":\n    with mp.Pool(processes=4) as pool:\n        results = pool.map(square, range(10))\n    print(results)<\/code><\/pre>\n\n\n\n<p>Bas\u00e1ndonos en esta din\u00e1mica, de cambiar los imports de `multiprocessing` por `lithops.multiprocessing`, podemos portar una multitud de aplicaciones programadas para ejecutarse localmente a la computaci\u00f3n serverless.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Conclusi\u00f3n<\/strong><\/h2>\n\n\n\n<p>En este art\u00edculo, hemos visto c\u00f3mo Lithops nos permite portar aplicaciones a la computaci\u00f3n serverless de forma sencilla y transparente. Gracias a la implementaci\u00f3n de la API de `multiprocessing`, podemos ejecutar aplicaciones programadas para ejecutarse localmente sobre serverless sin necesidad de modificar su c\u00f3digo. Esto nos permite aprovechar los beneficios de la computaci\u00f3n serverless, como su escalabilidad y su pago por uso, sin tener que reescribir nuestras aplicaciones.<\/p>\n\n\n\n<p>Y t\u00fa, \u00bfya has probado a portar tus aplicaciones a serverless con Lithops? \u00a1Cu\u00e9ntanos tu experiencia en los comentarios!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Imagina que tienes una aplicaci\u00f3n o programa en Python dise\u00f1ado para ejecutarse localmente, pero te gustar\u00eda portarlo a la computaci\u00f3n serverless. \u00bfC\u00f3mo lo har\u00edas? \u00bfCu\u00e1les ser\u00edan los pasos a seguir? \u00bfQu\u00e9 desaf\u00edos encontrar\u00edas en el camino? Veamos c\u00f3mo Lithops puede ayudarte en este proceso. Recapitulando En un art\u00edculo anterior, hablamos sobre el concepto de transparencia [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":877,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","_swt_meta_header_display":false,"_swt_meta_footer_display":false,"_swt_meta_site_title_display":false,"_swt_meta_sticky_header":false,"_swt_meta_transparent_header":false,"footnotes":""},"categories":[46,53,44],"tags":[68,80,81,63],"class_list":["post-876","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-cloudlab","category-fundamentos","category-proyectos","tag-lithops","tag-multiprocessing","tag-python","tag-transparencia"],"jetpack_featured_media_url":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp.webp","uagb_featured_image_src":{"full":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp.webp",1792,1024,false],"thumbnail":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp-150x150.webp",150,150,true],"medium":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp-300x171.webp",300,171,true],"medium_large":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp-768x439.webp",768,439,true],"large":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp-1024x585.webp",1024,585,true],"1536x1536":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp-1536x878.webp",1536,878,true],"2048x2048":["https:\/\/cloudlab.urv.cat\/catedracloud\/wp-content\/uploads\/2025\/02\/transparency-mp.webp",1792,1024,false]},"uagb_author_info":{"display_name":"Gerard Finol Pe\u00f1alver","author_link":"https:\/\/cloudlab.urv.cat\/catedracloud\/author\/gfinol\/"},"uagb_comment_info":0,"uagb_excerpt":"Imagina que tienes una aplicaci\u00f3n o programa en Python dise\u00f1ado para ejecutarse localmente, pero te gustar\u00eda portarlo a la computaci\u00f3n serverless. \u00bfC\u00f3mo lo har\u00edas? \u00bfCu\u00e1les ser\u00edan los pasos a seguir? \u00bfQu\u00e9 desaf\u00edos encontrar\u00edas en el camino? Veamos c\u00f3mo Lithops puede ayudarte en este proceso. Recapitulando En un art\u00edculo anterior, hablamos sobre el concepto de transparencia&hellip;","_links":{"self":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/876","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/comments?post=876"}],"version-history":[{"count":2,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/876\/revisions"}],"predecessor-version":[{"id":880,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/posts\/876\/revisions\/880"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/media\/877"}],"wp:attachment":[{"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/media?parent=876"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/categories?post=876"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/cloudlab.urv.cat\/catedracloud\/wp-json\/wp\/v2\/tags?post=876"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}