{"id":3496,"date":"2025-10-05T00:00:00","date_gmt":"2025-10-04T22:00:00","guid":{"rendered":"https:\/\/tecnologia.euroinnova.com\/concurrencia\/"},"modified":"2025-10-07T15:00:05","modified_gmt":"2025-10-07T13:00:05","slug":"concurrence","status":"publish","type":"post","link":"https:\/\/tecnologia.euroinnova.com\/en\/concurrencia","title":{"rendered":"Concurrence"},"content":{"rendered":"<p class=\"text-align-justify\">La concurrencia se refiere a la <strong>capacidad de un sistema para ejecutar m\u00faltiples tareas simult\u00e1neamente. <\/strong>Por lo que la concurrencia es una caracter\u00edstica esencial que permite a los desarrolladores crear aplicaciones que pueden realizar varias operaciones al mismo tiempo, mejorando as\u00ed el rendimiento y la eficiencia del software.&nbsp;<\/p>\n<p class=\"text-align-justify\">La concurrencia se puede lograr mediante el uso de varios<strong> hilos de ejecuci\u00f3n o threads, que son unidades independientes de procesamiento <\/strong>que pueden ejecutar tareas de manera concurrente. Los lenguajes de programaci\u00f3n proporcionan varias formas de trabajar con hilos, lo que permite a los desarrolladores implementar la concurrencia de manera eficaz en sus aplicaciones.&nbsp;<\/p>\n<h2 class=\"text-align-justify\" class=\"text-align-justify\" id=\"ejemplo-de-concurrencia-e-hilos\">Ejemplo de concurrencia e hilos<\/h2>\n<p class=\"text-align-justify\">Una de las formas m\u00e1s comunes de trabajar con concurrencia utilizando de ejemplo Python es utilizando la clase Thread o implementando la interfaz Runnable. Por ejemplo, se puede crear una clase que extienda la clase Thread y sobrescribir el m\u00e9todo run() para definir la tarea que se ejecutar\u00e1 en un hilo separado. Ejemplo b\u00e1sico:&nbsp;<\/p>\n<p class=\"text-align-justify\">import threading&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Definir una funci\u00f3n que ser\u00e1 ejecutada por un hilo&nbsp;<\/p>\n<p class=\"text-align-justify\">def tarea():&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; print(\u00abHola desde el hilo\u00bb)&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Crear un hilo y ejecutar la funci\u00f3n tarea&nbsp;<\/p>\n<p class=\"text-align-justify\">hilo = threading.Thread(target=tarea)&nbsp;<\/p>\n<p class=\"text-align-justify\">hilo.start()&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\">En este ejemplo, se define una funci\u00f3n tarea() que simplemente imprime un mensaje en la consola. Luego, se crea un objeto Thread especificando la funci\u00f3n tarea como el objetivo del hilo, y se inicia la ejecuci\u00f3n del hilo llamando al m\u00e9todo start().&nbsp;<\/p>\n<h3 class=\"text-align-justify\" class=\"text-align-justify\" id=\"concurrencia-con-threadpoolexecutor\">Concurrencia con ThreadPoolExecutor<\/h3>\n<p class=\"text-align-justify\">Adem\u00e1s del m\u00f3dulo threading, Python tambi\u00e9n proporciona el m\u00f3dulo concurrent.futures, que ofrece una interfaz de alto nivel para trabajar con concurrencia y paralelismo. Este m\u00f3dulo incluye clases como ThreadPoolExecutor y ProcessPoolExecutor, que permiten ejecutar funciones de manera concurrente utilizando pools de hilos o procesos. Aqu\u00ed tienes un ejemplo de c\u00f3mo usar ThreadPoolExecutor:&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\">from concurrent.futures import ThreadPoolExecutor&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Definir una funci\u00f3n que ser\u00e1 ejecutada por un hilo&nbsp;<\/p>\n<p class=\"text-align-justify\">def tarea():&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; print(\u00abHola desde el hilo\u00bb)&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Crear un ThreadPoolExecutor con un pool de 5 hilos&nbsp;<\/p>\n<p class=\"text-align-justify\">executor = ThreadPoolExecutor(max_workers=5)&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Ejecutar m\u00faltiples tareas utilizando el ThreadPoolExecutor&nbsp;<\/p>\n<p class=\"text-align-justify\">for _ in range(10):&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; executor.submit(tarea)&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Apagar el ThreadPoolExecutor cuando se hayan completado todas las tareas&nbsp;<\/p>\n<p class=\"text-align-justify\">executor.shutdown()&nbsp;<\/p>\n<p class=\"text-align-justify\">En este ejemplo, se crea un ThreadPoolExecutor con un m\u00e1ximo de 5 hilos en el pool. Luego, se utiliza el m\u00e9todo submit() para enviar las tareas a ejecutar al pool de hilos. Una vez que se han enviado todas las tareas, se llama al m\u00e9todo shutdown() para apagar el ThreadPoolExecutor.&nbsp;<\/p>\n<p class=\"text-align-justify\">Ahora, <strong>si tuvi\u00e9ramos que hacer m\u00faltiples solicitudes a diferentes sitios web y procesar los datos<\/strong>, podemos usar un \u201cThreadPoolExecutor\u201d para enviar las solicitudes en paralelo y luego procesas los resultados de forma concurrente.&nbsp;<\/p>\n<p class=\"text-align-justify\">from concurrent.futures import ThreadPoolExecutor&nbsp;<\/p>\n<p class=\"text-align-justify\">import requests&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Funci\u00f3n para realizar una solicitud HTTP&nbsp;<\/p>\n<p class=\"text-align-justify\">def hacer_solicitud(url):&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; response = requests.get(url)&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; return response.text&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\">urls = [&#8216;https:\/\/sitio1.com&#8217;, &#8216;https:\/\/sitio2.com&#8217;, &#8216;https:\/\/sitio3.com&#8217;]&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Crear un ThreadPoolExecutor&nbsp;<\/p>\n<p class=\"text-align-justify\">with ThreadPoolExecutor() as executor:&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; # Enviar las solicitudes en paralelo&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; resultados = executor.map(hacer_solicitud, urls)&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;<\/p>\n<p class=\"text-align-justify\"># Procesar los resultados&nbsp;<\/p>\n<p class=\"text-align-justify\">for resultado in resultados:&nbsp;<\/p>\n<p class=\"text-align-justify\">&nbsp;&nbsp;&nbsp; procesar(resultado)&nbsp;<\/p>\n<p class=\"text-align-justify\">Por lo general, la concurrencia permite a los desarrolladores crear aplicaciones m\u00e1s r\u00e1pidas y eficientes, aprovechando muy bien los recursos del sistema. Ya sea utilizando el m\u00f3dulo threading para trabajar con hilos de ejecuci\u00f3n, aunque crean una capa m\u00e1s de complejidad sobre lo programado en el sistema.&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>La concurrencia se refiere a la capacidad de un sistema para ejecutar m\u00faltiples tareas simult\u00e1neamente. Por lo que la concurrencia [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[25],"tags":[],"class_list":["post-3496","post","type-post","status-publish","format-standard","hentry","category-metaterminos"],"acf":[],"_links":{"self":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/posts\/3496","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/comments?post=3496"}],"version-history":[{"count":0,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/posts\/3496\/revisions"}],"wp:attachment":[{"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/media?parent=3496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/categories?post=3496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tecnologia.euroinnova.com\/en\/wp-json\/wp\/v2\/tags?post=3496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}