<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>programación concurrente archivos - Frexus</title>
	<atom:link href="https://www.frexus.dev/tag/programacion-concurrente/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.frexus.dev/tag/programacion-concurrente/</link>
	<description>Generando Valor Agreado</description>
	<lastBuildDate>Thu, 24 Jul 2025 20:04:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://www.frexus.dev/wp-content/uploads/2024/03/cropped-Captura-de-Pantalla-2022-12-26-a-las-15.52.42-32x32.png</url>
	<title>programación concurrente archivos - Frexus</title>
	<link>https://www.frexus.dev/tag/programacion-concurrente/</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">215529362</site>	<item>
		<title>Ejercicios &#124; Hilos</title>
		<link>https://www.frexus.dev/post/ejercicios-hilos/</link>
					<comments>https://www.frexus.dev/post/ejercicios-hilos/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Thu, 14 Sep 2023 19:18:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[Ejercicios]]></category>
		<category><![CDATA[hilos]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2432</guid>

					<description><![CDATA[<p>A continuación se describe seis ejercicios sencillos que abordan los temas de introducción a la programación concurrente, conceptos de programación concurrente, arquitecturas paralelas y distribuidas, así como algoritmos paralelos y distribuidos. Estos ejercicios están diseñados para abordar conceptos básicos en hilos, exclusión mutua, monitores, semáforos y MPI. Se pueden adaptar al lenguaje de programación que se este utilizando.</p>
<p>La entrada <a href="https://www.frexus.dev/post/ejercicios-hilos/">Ejercicios | Hilos</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img fetchpriority="high" decoding="async" width="1024" height="678" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg" alt=" ejercicios | hilos person encoding in laptop" class="wp-image-2403" style="width:350px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-300x199.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-768x509.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1536x1017.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1140x755.jpeg 1140w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-500x330.jpeg 500w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071.jpeg 1880w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by Lukas on <a href="https://www.pexels.com/photo/person-encoding-in-laptop-574071/">Pexels.com</a></figcaption></figure>
</div>


<p>A continuación se describe seis ejercicios sencillos que abordan los temas de introducción a la programación concurrente, conceptos de programación concurrente, arquitecturas paralelas y distribuidas, así como algoritmos paralelos y distribuidos.</p>



<ul class="wp-block-list">
<li>Escribe un programa en el lenguaje de programación de tu elección que cree dos hilos. Cada hilo debe imprimir un mensaje simple, como &#8220;Hola desde Hilo 1&#8221; y &#8220;Hola desde Hilo 2&#8221;.</li>



<li>Modifica el programa anterior para que ambos hilos intenten acceder y modificar una variable compartida. Utiliza un mecanismo de exclusión mutua (por ejemplo, mutex) para garantizar que solo un hilo pueda modificar la variable a la vez.</li>



<li>Crea un programa que simule la producción y el consumo de un recurso compartido utilizando monitores. Puedes elegir un escenario simple, como un productor que agrega elementos a un búfer y un consumidor que los retira.</li>



<li>Diseña un programa que utilice semáforos para sincronizar la ejecución de tres hilos. Cada hilo debe imprimir un mensaje en un orden específico, por ejemplo, &#8220;Hilo 1&#8221;, &#8220;Hilo 2&#8221; y &#8220;Hilo 3&#8221; en ese orden.</li>



<li>Desarrolla un programa MPI simple en el que un proceso maestro envíe un mensaje a varios procesos esclavos, y estos procesos esclavos respondan al maestro. Puedes usar funciones MPI como <code>MPI_Send</code> y <code>MPI_Recv</code>.</li>



<li>Implementa un problema clásico de productor-consumidor utilizando hilos y semáforos. El productor debe agregar elementos a un búfer compartido, y el consumidor debe retirarlos. Utiliza semáforos para evitar condiciones de carrera.</li>
</ul>



<p>Estos ejercicios están diseñados para abordar conceptos básicos en hilos, exclusión mutua, monitores, semáforos y MPI. Se pueden adaptar al lenguaje de programación que se este utilizando.</p>
<p>La entrada <a href="https://www.frexus.dev/post/ejercicios-hilos/">Ejercicios | Hilos</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/ejercicios-hilos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2432</post-id>	</item>
		<item>
		<title>Integración de Sistemas en una Planta de Manufactura con CORBA</title>
		<link>https://www.frexus.dev/post/manufactura/</link>
					<comments>https://www.frexus.dev/post/manufactura/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Wed, 13 Sep 2023 19:04:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[caso de estudio]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2427</guid>

					<description><![CDATA[<p>Una planta de manufactura se enfrenta al desafío de integrar sistemas heterogéneos utilizados en diferentes etapas del proceso de producción. Cada sistema controla un componente específico del proceso y utiliza tecnologías diversas, como sistemas de control de procesos, sistemas de gestión de calidad y sistemas de monitoreo de maquinaria. La falta de interoperabilidad entre estos sistemas impide una comunicación eficiente y la recopilación de datos en tiempo real. Los datos críticos para la toma de decisiones están dispersos en silos, lo que dificulta la optimización de la producción y la detección temprana de problemas. Se decide implementar una arquitectura basada en CORBA para facilitar la comunicación entre los sistemas heterogéneos y permitir el intercambio de información en tiempo real. Pasos de Implementación: Cuestiones para analizar Este caso de estudio ilustra cómo la implementación de CORBA puede resolver problemas de integración en entornos industriales complejos, mejorando la eficiencia operativa y facilitando la toma de decisiones informada.</p>
<p>La entrada <a href="https://www.frexus.dev/post/manufactura/">Integración de Sistemas en una Planta de Manufactura con CORBA</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="684" height="1024" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-3183165-684x1024.jpeg" alt="manufactura top view photo of people having a meeting" class="wp-image-2382" style="width:296px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-3183165-684x1024.jpeg 684w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-3183165-200x300.jpeg 200w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-3183165-768x1150.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-3183165.jpeg 868w" sizes="(max-width: 684px) 100vw, 684px" /><figcaption class="wp-element-caption">Photo by fauxels on <a href="https://www.pexels.com/photo/top-view-photo-of-people-having-a-meeting-3183165/">Pexels.com</a></figcaption></figure>
</div>


<p>Una planta de manufactura se enfrenta al desafío de integrar sistemas heterogéneos utilizados en diferentes etapas del proceso de producción. Cada sistema controla un componente específico del proceso y utiliza tecnologías diversas, como sistemas de control de procesos, sistemas de gestión de calidad y sistemas de monitoreo de maquinaria.</p>



<p>La falta de interoperabilidad entre estos sistemas impide una comunicación eficiente y la recopilación de datos en tiempo real. Los datos críticos para la toma de decisiones están dispersos en silos, lo que dificulta la optimización de la producción y la detección temprana de problemas.</p>



<p>Se decide implementar una arquitectura basada en CORBA para facilitar la comunicación entre los sistemas heterogéneos y permitir el intercambio de información en tiempo real.</p>



<h2 class="wp-block-heading"><em>Pasos de Implementación:</em></h2>



<ol class="wp-block-list">
<li><strong>Definición de Interfaces en IDL:</strong> Se realiza un análisis de los datos que deben intercambiarse entre los sistemas y se define una interfaz en IDL que describa cómo se estructurarán y transmitirán estos datos.</li>



<li><strong>Generación de Stubs y Esqueletos:</strong> Utilizando el compilador IDL, se generan automáticamente stubs y esqueletos en los lenguajes de programación utilizados en cada sistema.</li>



<li><strong>Desarrollo de Servidores y Clientes CORBA:</strong> Se implementan servidores CORBA en cada sistema para exponer las funcionalidades y datos relevantes. Los clientes CORBA se desarrollan para acceder a estos servicios y datos.</li>



<li><strong>Integración y Pruebas:</strong> Se integran los sistemas utilizando CORBA como middleware. Se realizan pruebas exhaustivas para garantizar la correcta comunicación entre los sistemas y la precisión en la transferencia de datos.</li>



<li><strong>Resultados:</strong>
<ul class="wp-block-list">
<li><strong>Optimización de la Producción:</strong> La comunicación eficiente entre sistemas permite una optimización más efectiva de la producción al coordinar y sincronizar las operaciones en tiempo real.</li>



<li><strong>Detección Temprana de Problemas:</strong> La recopilación en tiempo real de datos de múltiples sistemas facilita la detección temprana de problemas, lo que permite tomar medidas correctivas antes de que afecten significativamente la producción.</li>



<li><strong>Acceso Centralizado a Datos:</strong> La implementación de CORBA proporciona un acceso centralizado a datos críticos, eliminando los silos de información y mejorando la toma de decisiones.</li>



<li><strong>Escalabilidad y Mantenimiento:</strong> La arquitectura basada en CORBA demuestra ser escalable y facilita el mantenimiento, ya que la adición de nuevos sistemas o la actualización de existentes se puede realizar de manera más eficiente.</li>
</ul>
</li>
</ol>



<h2 class="wp-block-heading">Cuestiones para analizar</h2>



<ol class="wp-block-list">
<li><strong>Pregunta 1:</strong>
<ul class="wp-block-list">
<li>¿Cómo ayudó la implementación de CORBA en la planta de manufactura a superar la falta de interoperabilidad entre los sistemas heterogéneos utilizados en diferentes etapas del proceso de producción?</li>
</ul>
</li>



<li><strong>Pregunta 2:</strong>
<ul class="wp-block-list">
<li>¿Cuáles fueron los beneficios clave de utilizar CORBA en términos de optimización de la producción y coordinación de operaciones en tiempo real?</li>
</ul>
</li>



<li><strong>Pregunta 3:</strong>
<ul class="wp-block-list">
<li>¿Cómo contribuyó la arquitectura basada en CORBA a la detección temprana de problemas en la planta de manufactura?</li>
</ul>
</li>



<li><strong>Pregunta 4:</strong>
<ul class="wp-block-list">
<li>¿De qué manera CORBA facilitó el acceso centralizado a datos críticos y eliminó los silos de información en la planta?</li>
</ul>
</li>



<li><strong>Pregunta 5:</strong>
<ul class="wp-block-list">
<li>¿Cómo demostró la implementación de CORBA ser escalable y facilitar el mantenimiento en el entorno industrial de la planta?</li>
</ul>
</li>



<li><strong>Pregunta 6:</strong>
<ul class="wp-block-list">
<li>¿Cuál fue el impacto general de la implementación de CORBA en la eficiencia operativa y la toma de decisiones informada en la planta de manufactura?</li>
</ul>
</li>
</ol>



<p>Este caso de estudio ilustra cómo la implementación de CORBA puede resolver problemas de integración en entornos industriales complejos, mejorando la eficiencia operativa y facilitando la toma de decisiones informada.</p>
<p>La entrada <a href="https://www.frexus.dev/post/manufactura/">Integración de Sistemas en una Planta de Manufactura con CORBA</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/manufactura/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2427</post-id>	</item>
		<item>
		<title>CORBA</title>
		<link>https://www.frexus.dev/post/corba/</link>
					<comments>https://www.frexus.dev/post/corba/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Tue, 12 Sep 2023 18:37:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[corba]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2419</guid>

					<description><![CDATA[<p>CORBA, &#8220;Common Object Request Broker Architecture&#8221; (Arquitectura Común de Buscador de Objetos), proporciona un marco para el desarrollo de sistemas distribuidos que pueden involucrar operaciones concurrentes. Aunque no se centra exclusivamente en la programación concurrente, su capacidad para facilitar la comunicación y la interoperabilidad entre objetos distribuidos contribuye a la construcción de sistemas que operan de manera concurrente en entornos distribuidos. Este es un ejemplo sencillo de cómo usar CORBA en un entorno distribuido. En este caso, se debe de imaginar un sistema donde tenemos un servidor que proporciona servicios matemáticos simples y un cliente que utiliza estos servicios. Definición de la Interfaz en IDL Se debe de comenzar definiendo la interfaz en IDL (Interface Definition Language). Suponga que se quiere realizar operaciones matemáticas básicas. Generación de Stubs y Esqueletos Se Usara un compilador IDL para generar los stubs y esqueletos correspondientes en los lenguajes de programación que se esta utilizando. Aquí se supone que se esta usando Java. Esto generará archivos como MathOperations/Calculator.java, que contendrán los stubs y esqueletos necesarios. Implementación del Servidor Creamos un servidor en Java que implementa la interfaz. Implementación del Cliente Creamos un cliente que utiliza los servicios proporcionados por el servidor. Compilación y Ejecución Compile y ejecute el servidor y el cliente. Asegúrate de tener el ORB en ejecución antes de ejecutar el cliente. Este ejemplo básico ilustra cómo definir una interfaz en IDL, generar stubs y esqueletos, implementar un servidor y un cliente en Java, y cómo realizar operaciones remotas a través de CORBA. Hay que tener en cuenta que en un entorno de producción, se deben manejar aspectos como la gestión de excepciones, la seguridad y la configuración.</p>
<p>La entrada <a href="https://www.frexus.dev/post/corba/">CORBA</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img decoding="async" width="1024" height="678" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg" alt="CORBA person encoding in laptop" class="wp-image-2403" style="width:390px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-300x199.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-768x509.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1536x1017.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1140x755.jpeg 1140w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-500x330.jpeg 500w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071.jpeg 1880w" sizes="(max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by Lukas on <a href="https://www.pexels.com/photo/person-encoding-in-laptop-574071/">Pexels.com</a></figcaption></figure>
</div>


<p>CORBA, &#8220;Common Object Request Broker Architecture&#8221; (Arquitectura Común de Buscador de Objetos), proporciona un marco para el desarrollo de sistemas distribuidos que pueden involucrar operaciones concurrentes. Aunque no se centra exclusivamente en la programación concurrente, su capacidad para facilitar la comunicación y la interoperabilidad entre objetos distribuidos contribuye a la construcción de sistemas que operan de manera concurrente en entornos distribuidos.</p>



<p>Este es un ejemplo sencillo de cómo usar CORBA en un entorno distribuido. En este caso, se debe de imaginar un sistema donde tenemos un servidor que proporciona servicios matemáticos simples y un cliente que utiliza estos servicios.</p>



<h2 class="wp-block-heading"><strong>Definición de la Interfaz en IDL</strong></h2>



<p>Se debe de comenzar definiendo la interfaz en IDL (Interface Definition Language). Suponga que se quiere realizar operaciones matemáticas básicas.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="raw" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// MathOperations.idl
module MathOperations {
  interface Calculator {
    double add(in double num1, in double num2);
    double subtract(in double num1, in double num2);
    double multiply(in double num1, in double num2);
    double divide(in double num1, in double num2);
  };
};</pre>



<h2 class="wp-block-heading"><strong>Generación de Stubs y Esqueletos</strong></h2>



<p>Se Usara un compilador IDL para generar los stubs y esqueletos correspondientes en los lenguajes de programación que se esta utilizando. Aquí se supone que se esta usando Java.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="bat" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">idlj -fall MathOperations.idl</pre>



<p>Esto generará archivos como <code>MathOperations/Calculator.java</code>, que contendrán los stubs y esqueletos necesarios.</p>



<h2 class="wp-block-heading"><strong>Implementación del Servidor</strong></h2>



<p>Creamos un servidor en Java que implementa la interfaz.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="java" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// MathServer.java
import MathOperations.*;

public class MathServer extends CalculatorPOA {
  public double add(double num1, double num2) {
    return num1 + num2;
  }

  public double subtract(double num1, double num2) {
    return num1 - num2;
  }

  public double multiply(double num1, double num2) {
    return num1 * num2;
  }

  public double divide(double num1, double num2) {
    if (num2 != 0) {
      return num1 / num2;
    } else {
      System.out.println("Error: Division by zero.");
      return 0;
    }
  }

  public static void main(String[] args) {
    org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
    try {
      org.omg.CORBA.Object objRef = orb.resolve_initial_references("RootPOA");
      POA rootpoa = POAHelper.narrow(objRef);
      rootpoa.the_POAManager().activate();

      MathServer mathServer = new MathServer();
      org.omg.CORBA.Object ref = rootpoa.servant_to_reference(mathServer);
      Calculator href = CalculatorHelper.narrow(ref);

      System.out.println("Math Server ready and waiting ...");
      orb.run();
    } catch (Exception e) {
      System.err.println("Error: " + e);
      e.printStackTrace(System.out);
    }
  }
}</pre>



<h2 class="wp-block-heading"><strong>Implementación del Cliente</strong></h2>



<p>Creamos un cliente que utiliza los servicios proporcionados por el servidor.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">// MathClient.java
import MathOperations.*;

public class MathClient {
  public static void main(String[] args) {
    try {
      org.omg.CORBA.ORB orb = org.omg.CORBA.ORB.init(args, null);
      org.omg.CORBA.Object objRef = orb.string_to_object("corbaname::localhost:1050#Calculator");
      Calculator calculatorRef = CalculatorHelper.narrow(objRef);

      double num1 = 10.0;
      double num2 = 5.0;

      System.out.println("Adding: " + num1 + " + " + num2 + " = " + calculatorRef.add(num1, num2));
      System.out.println("Subtracting: " + num1 + " - " + num2 + " = " + calculatorRef.subtract(num1, num2));
      System.out.println("Multiplying: " + num1 + " * " + num2 + " = " + calculatorRef.multiply(num1, num2));
      System.out.println("Dividing: " + num1 + " / " + num2 + " = " + calculatorRef.divide(num1, num2));

      orb.shutdown(false);
    } catch (Exception e) {
      System.err.println("Error: " + e);
      e.printStackTrace(System.out);
    }
  }
}</pre>



<h2 class="wp-block-heading"><strong>Compilación y Ejecución</strong></h2>



<p>Compile y ejecute el servidor y el cliente. Asegúrate de tener el ORB en ejecución antes de ejecutar el cliente.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="generic" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">javac MathOperations/*.java MathServer.java MathClient.java
java MathServer -ORBInitialPort 1050 &amp;
java MathClient -ORBInitialPort 1050</pre>



<p>Este ejemplo básico ilustra cómo definir una interfaz en IDL, generar stubs y esqueletos, implementar un servidor y un cliente en Java, y cómo realizar operaciones remotas a través de CORBA. Hay que tener en cuenta que en un entorno de producción, se deben manejar aspectos como la gestión de excepciones, la seguridad y la configuración.</p>
<p>La entrada <a href="https://www.frexus.dev/post/corba/">CORBA</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/corba/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2419</post-id>	</item>
		<item>
		<title>CUDA</title>
		<link>https://www.frexus.dev/post/cuda/</link>
					<comments>https://www.frexus.dev/post/cuda/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Sun, 10 Sep 2023 13:34:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[cuda]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2412</guid>

					<description><![CDATA[<p>CUDA (Compute Unified Device Architecture) es una tecnología de NVIDIA, por lo que si tienes una tarjeta gráfica de otro fabricante, como AMD, no sería compatible con CUDA. Se debe explorar alternativas, como OpenCL, que es un estándar abierto de programación para plataformas heterogéneas. CUDA ha sido ampliamente adoptado en la comunidad de desarrollo, especialmente en áreas que se benefician de la capacidad de procesamiento masivamente paralelo de las GPUs. Además, otras compañías y proyectos han desarrollado tecnologías similares, pero CUDA es específico de las GPUs de NVIDIA. A continuación se tiene un ejemplo sencillo en CUDA que realiza la suma de dos vectores. Este ejemplo se puede ejecutar en una GPU compatible con CUDA. Código Este programa realiza la suma de dos vectores en paralelo utilizando. Se debe de tener en cuenta que este es un ejemplo básico y que el desarrollo puede involucrar consideraciones adicionales, como la optimización del tamaño de los bloques y la gestión de la memoria en el dispositivo. Bibliotecas en python Para ejecutarse desde Python, existen varias bibliotecas y herramientas que permiten integrarlas en programas escritos en Python PyCUDA PyCUDA es una biblioteca que proporciona enlaces de Python para CUDA. Permite escribir y aprovechar las capacidades de cómputo en paralelo de las GPUs de NVIDIA. Se puede instalar PyCUDA utilizando pip Numba Numba es una biblioteca de Python que permite la compilación JIT (Just-In-Time) de funciones Python para ejecución en GPU. Puedes utilizar la funcionalidad @cuda.jit para decorar funciones que se ejecutarán en la GPU. CuPy CuPy es una biblioteca similar a NumPy pero diseñada para ejecutarse en GPU. Proporciona una interfaz familiar para realizar operaciones en GPU y puede ser una alternativa eficiente para cálculos numéricos. Estas bibliotecas permiten integrar código CUDA directamente en programas Python, facilitando el desarrollo de aplicaciones de cómputo en paralelo. Hay que tener en cuenta que, al utilizarlas en Python, aún se necesitará tener instalado el Toolkit de CUDA de NVIDIA y controladores compatibles con tu GPU.</p>
<p>La entrada <a href="https://www.frexus.dev/post/cuda/">CUDA</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="678" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg" alt=" cuda person encoding in laptop" class="wp-image-2403" style="width:396px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-300x199.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-768x509.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1536x1017.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1140x755.jpeg 1140w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-500x330.jpeg 500w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071.jpeg 1880w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by Lukas on <a href="https://www.pexels.com/photo/person-encoding-in-laptop-574071/">Pexels.com</a></figcaption></figure>
</div>


<p>CUDA (Compute Unified Device Architecture) es una tecnología de NVIDIA, por lo que si tienes una tarjeta gráfica de otro fabricante, como AMD, no sería compatible con CUDA. Se debe explorar alternativas, como OpenCL, que es un estándar abierto de programación para plataformas heterogéneas.</p>



<p>CUDA ha sido ampliamente adoptado en la comunidad de desarrollo, especialmente en áreas que se benefician de la capacidad de procesamiento masivamente paralelo de las GPUs. Además, otras compañías y proyectos han desarrollado tecnologías similares, pero CUDA es específico de las GPUs de NVIDIA.</p>



<p>A continuación se tiene un ejemplo sencillo en CUDA que realiza la suma de dos vectores. Este ejemplo se puede ejecutar en una GPU compatible con CUDA.</p>



<h2 class="wp-block-heading">Código</h2>



<pre class="EnlighterJSRAW" data-enlighter-language="c" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">#include &lt;stdio.h>

// Kernel CUDA para sumar dos vectores
__global__ void vectorSum(float *a, float *b, float *result, int size) {
    int index = blockIdx.x * blockDim.x + threadIdx.x;
    if (index &lt; size) {
        result[index] = a[index] + b[index];
    }
}

int main() {
    const int size = 1024;  // Tamaño de los vectores
    const int threadsPerBlock = 256;
    const int blocksPerGrid = (size + threadsPerBlock - 1) / threadsPerBlock;

    // Declaración de vectores en el host
    float hostVectorA[size], hostVectorB[size], hostResult[size];

    // Inicialización de los vectores en el host
    for (int i = 0; i &lt; size; ++i) {
        hostVectorA[i] = i;
        hostVectorB[i] = 2 * i;
    }

    // Declaración de punteros para los vectores en el dispositivo (GPU)
    float *deviceVectorA, *deviceVectorB, *deviceResult;

    // Reserva de memoria en el dispositivo
    cudaMalloc((void **)&amp;deviceVectorA, size * sizeof(float));
    cudaMalloc((void **)&amp;deviceVectorB, size * sizeof(float));
    cudaMalloc((void **)&amp;deviceResult, size * sizeof(float));

    // Copia de datos desde el host al dispositivo
    cudaMemcpy(deviceVectorA, hostVectorA, size * sizeof(float), cudaMemcpyHostToDevice);
    cudaMemcpy(deviceVectorB, hostVectorB, size * sizeof(float), cudaMemcpyHostToDevice);

    // Lanzamiento del kernel CUDA
    vectorSum&lt;&lt;&lt;blocksPerGrid, threadsPerBlock>>>(deviceVectorA, deviceVectorB, deviceResult, size);

    // Copia de resultados desde el dispositivo al host
    cudaMemcpy(hostResult, deviceResult, size * sizeof(float), cudaMemcpyDeviceToHost);

    // Impresión de resultados
    for (int i = 0; i &lt; size; ++i) {
        printf("%f + %f = %f\n", hostVectorA[i], hostVectorB[i], hostResult[i]);
    }

    // Liberación de memoria en el dispositivo
    cudaFree(deviceVectorA);
    cudaFree(deviceVectorB);
    cudaFree(deviceResult);

    return 0;
}</pre>



<p>Este programa realiza la suma de dos vectores en paralelo utilizando. Se debe de tener en cuenta que este es un ejemplo básico y que el desarrollo puede involucrar consideraciones adicionales, como la optimización del tamaño de los bloques y la gestión de la memoria en el dispositivo.</p>



<h2 class="wp-block-heading">Bibliotecas  en python</h2>



<p>Para ejecutarse desde Python, existen varias bibliotecas y herramientas que permiten integrarlas en programas escritos en Python</p>



<h4 class="wp-block-heading"><strong>PyCUDA</strong></h4>



<p>PyCUDA es una biblioteca que proporciona enlaces de Python para CUDA. Permite escribir y aprovechar las capacidades de cómputo en paralelo de las GPUs de NVIDIA. Se puede instalar PyCUDA utilizando pip</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">pip install pycuda</pre>



<h4 class="wp-block-heading"><strong>Numba</strong></h4>



<p>Numba es una biblioteca de Python que permite la compilación JIT (Just-In-Time) de funciones Python para ejecución en GPU. Puedes utilizar la funcionalidad <code>@cuda.jit</code> para decorar funciones que se ejecutarán en la GPU.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">from numba import cuda

@cuda.jit
def vector_sum(a, b, result):
    idx = cuda.grid(1)
    if idx &lt; len(a):
        result[idx] = a[idx] + b[idx]</pre>



<h4 class="wp-block-heading"><strong>CuPy</strong></h4>



<p>CuPy es una biblioteca similar a NumPy pero diseñada para ejecutarse en GPU. Proporciona una interfaz familiar para realizar operaciones en GPU y puede ser una alternativa eficiente para cálculos numéricos.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import cupy as cp

# Crear arrays en GPU
a_gpu = cp.array([1, 2, 3])
b_gpu = cp.array([4, 5, 6])

# Realizar la suma en GPU
result_gpu = a_gpu + b_gpu

# Transferir el resultado de vuelta a la CPU si es necesario
result_cpu = cp.asnumpy(result_gpu)
</pre>



<p>Estas bibliotecas permiten integrar código CUDA directamente en programas Python, facilitando el desarrollo de aplicaciones de cómputo en paralelo. Hay que tener en cuenta que, al utilizarlas en Python, aún se necesitará tener instalado el Toolkit de CUDA de NVIDIA y controladores compatibles con tu GPU.</p>
<p>La entrada <a href="https://www.frexus.dev/post/cuda/">CUDA</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/cuda/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2412</post-id>	</item>
		<item>
		<title>Ejercicios &#124; programación distribudia</title>
		<link>https://www.frexus.dev/post/ejercicios/</link>
					<comments>https://www.frexus.dev/post/ejercicios/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Sat, 09 Sep 2023 15:51:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[Ejercicios]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[programación distribuida]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2409</guid>

					<description><![CDATA[<p>Estos ejercicios están diseñados para abordar diversos aspectos, desde la comunicación hasta la coordinación de procesos. Se puede usar cualquier lenguaje de programación. Ejercicios Estos ejercicios están diseñados para proporcionar práctica en conceptos clave de programación distribuida y concurrente. Si eres nuevo en la programación distribuida, es posible que encuentres ciertos desafíos al principio, pero estos ejercicios están diseñados para ser accesibles y educativos. Se recomienda abordarlos en orden y, si es necesario, buscar recursos adicionales o consultar la documentación relacionada con las tecnologías que se este utilizando.</p>
<p>La entrada <a href="https://www.frexus.dev/post/ejercicios/">Ejercicios | programación distribudia</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="678" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg" alt="ejercicios person encoding in laptop" class="wp-image-2403" style="width:447px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-300x199.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-768x509.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1536x1017.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1140x755.jpeg 1140w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-500x330.jpeg 500w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071.jpeg 1880w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by Lukas on <a href="https://www.pexels.com/photo/person-encoding-in-laptop-574071/">Pexels.com</a></figcaption></figure>
</div>


<p>Estos ejercicios están diseñados para abordar diversos aspectos, desde la comunicación hasta la coordinación de procesos. Se puede usar cualquier lenguaje de programación.</p>



<h2 class="wp-block-heading">Ejercicios</h2>



<ul class="wp-block-list">
<li>Implementa un programa distribuido donde dos procesos (A y B) se comuniquen enviándose mensajes simples.</li>



<li>Desarrolla un sistema distribuido que realice una tarea coordinada entre tres procesos, donde cada proceso realiza una parte específica de la tarea y comparten resultados.</li>



<li>Crea un programa que utilice algún mecanismo de sincronización distribuida (por ejemplo, semáforos distribuidos) para garantizar el acceso seguro y sincronizado a un recurso compartido.</li>



<li>Modifica uno de los ejercicios anteriores para incorporar algún mecanismo de tolerancia a fallos. Puedes simular fallos y observar cómo el sistema responde.</li>



<li>Desarrolla un programa que demuestre la escalabilidad en un entorno distribuido. A medida que se agregan más nodos, la capacidad del sistema para manejar la carga de trabajo debe aumentar.</li>



<li>Crea un sistema distribuido que distribuya tareas entre múltiples nodos para procesar en paralelo. Asegúrate de que los resultados de las tareas paralelas se recojan y combinen adecuadamente.</li>
</ul>



<p>Estos ejercicios están diseñados para proporcionar práctica en conceptos clave de programación distribuida y concurrente. </p>



<p>Si eres nuevo en la programación distribuida, es posible que encuentres ciertos desafíos al principio, pero estos ejercicios están diseñados para ser accesibles y educativos. Se recomienda abordarlos en orden y, si es necesario, buscar recursos adicionales o consultar la documentación relacionada con las tecnologías que se este utilizando.</p>
<p>La entrada <a href="https://www.frexus.dev/post/ejercicios/">Ejercicios | programación distribudia</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/ejercicios/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2409</post-id>	</item>
		<item>
		<title>Distribuida</title>
		<link>https://www.frexus.dev/post/distribuida/</link>
					<comments>https://www.frexus.dev/post/distribuida/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Fri, 08 Sep 2023 14:56:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[programación distribudia]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2406</guid>

					<description><![CDATA[<p>la programación distribuida es esencial en entornos modernos donde la escalabilidad, la redundancia y la tolerancia a fallos son fundamentales. Permite a los desarrolladores construir sistemas más flexibles y eficientes al aprovechar los recursos distribuidos de manera efectiva. A continuación se muestra unos ejemplos de su aplicación Ejemplo: Calculo distribuido. En este ejemplo simple de programación distribuida se utiliza Python y la biblioteca multiprocessing. Se simula un cálculo distribuido de la suma de elementos en una lista entre varios procesos en un sistema multicore. Código Explicación Este código divide una lista de números en partes y calcula la suma de cada parte en paralelo utilizando múltiples procesos. Cada proceso suma una porción de la lista, y al final, las sumas parciales se suman para obtener el resultado total. Este es un ejemplo simple de cómo se puede distribuir una tarea entre varios procesos para mejorar el rendimiento en un entorno multicore. En un entorno de programación distribuida a mayor escala, se podrían usar técnicas más avanzadas y herramientas específicas para la programación distribuida, como MPI o Apache Spark. Ejemplo 2: Comunicación entre procesos En este ejemplo se utiliza sockets en Python para implementar una comunicación simple entre dos procesos en diferentes máquinas, lo que refleja una situación de programación distribuida. Suponga que se tiene dos máquinas A y B, y se quiere que un proceso en la máquina A envíe un mensaje a un proceso en la máquina B. A continuación el código recomendado. Código (servidor en máquina B) Código (cliente en la máquina A): Explicación Este ejemplo ilustra la comunicación básica entre dos procesos en máquinas diferentes mediante sockets. Se puede ejecutar el servidor en la máquina B y el cliente en la máquina A. Se debe asegurar de reemplazar &#8216;dirección_IP_de_B&#8217; con la dirección IP real de la máquina B. Esta práctica refleja un escenario de programación distribuida donde los procesos pueden ejecutarse en diferentes máquinas y comunicarse a través de la red. En entornos más complejos, se podría utilizar bibliotecas específicas de programación distribuida como ZeroMQ, RabbitMQ, o incluso MPI</p>
<p>La entrada <a href="https://www.frexus.dev/post/distribuida/">Distribuida</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="1024" height="678" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg" alt="distribuida person encoding in laptop" class="wp-image-2403" style="width:438px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1024x678.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-300x199.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-768x509.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1536x1017.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-1140x755.jpeg 1140w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071-500x330.jpeg 500w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-574071.jpeg 1880w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /><figcaption class="wp-element-caption">Photo by Lukas on <a href="https://www.pexels.com/photo/person-encoding-in-laptop-574071/">Pexels.com</a></figcaption></figure>
</div>


<p>la programación distribuida es esencial en entornos modernos donde la escalabilidad, la redundancia y la tolerancia a fallos son fundamentales. Permite a los desarrolladores construir sistemas más flexibles y eficientes al aprovechar los recursos distribuidos de manera efectiva. A continuación se muestra unos ejemplos de su aplicación</p>



<h2 class="wp-block-heading">Ejemplo: Calculo distribuido.</h2>



<p>En este ejemplo simple de programación distribuida se utiliza Python y la biblioteca <code>multiprocessing</code>. Se simula un cálculo distribuido de la suma de elementos en una lista entre varios procesos en un sistema multicore.</p>



<h3 class="wp-block-heading">Código</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import multiprocessing

# Función para sumar elementos en una porción de la lista
def suma_parcial(lista, inicio, fin):
    suma_parcial = sum(lista[inicio:fin])
    return suma_parcial

if __name__ == "__main__":
    # Datos de ejemplo (lista de números)
    datos = list(range(1, 101))

    # Dividir la lista en varias partes
    num_procesos = 4
    longitud_sublista = len(datos) // num_procesos
    sublistas = [(i * longitud_sublista, (i + 1) * longitud_sublista) for i in range(num_procesos)]

    # Crear procesos y calcular sumas parciales en paralelo
    procesos = []
    for inicio, fin in sublistas:
        proceso = multiprocessing.Process(target=suma_parcial, args=(datos, inicio, fin))
        proceso.start()
        procesos.append(proceso)

    # Esperar a que todos los procesos terminen
    for proceso in procesos:
        proceso.join()

    # Recopilar resultados
    sumas_parciales = [proceso.exitcode for proceso in procesos]

    # Calcular la suma total
    suma_total = sum(sumas_parciales)

    print("Lista completa:", datos)
    print("Suma total distribuida:", suma_total)
</pre>



<h3 class="wp-block-heading">Explicación</h3>



<p>Este código divide una lista de números en partes y calcula la suma de cada parte en paralelo utilizando múltiples procesos. Cada proceso suma una porción de la lista, y al final, las sumas parciales se suman para obtener el resultado total. Este es un ejemplo simple de cómo se puede distribuir una tarea entre varios procesos para mejorar el rendimiento en un entorno multicore. En un entorno de programación distribuida a mayor escala, se podrían usar técnicas más avanzadas y herramientas específicas para la programación distribuida, como MPI o Apache Spark.</p>



<h2 class="wp-block-heading">Ejemplo 2: Comunicación entre procesos</h2>



<p>En este ejemplo se utiliza sockets en Python para implementar una comunicación simple entre dos procesos en diferentes máquinas, lo que refleja una situación de programación distribuida. Suponga que se tiene dos máquinas A y B, y se quiere que un proceso en la máquina A envíe un mensaje a un proceso en la máquina B. A continuación el código recomendado.</p>



<h3 class="wp-block-heading">Código (servidor en máquina B)</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import socket

# Configurar el servidor
host = '0.0.0.0'  # Escucha en todas las interfaces
puerto = 12345

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as servidor:
    servidor.bind((host, puerto))
    servidor.listen()

    print(f"Servidor escuchando en {host}:{puerto}")

    conexion, direccion = servidor.accept()

    with conexion:
        print(f"Conexión establecida desde {direccion}")

        # Recibir y mostrar el mensaje
        mensaje_recibido = conexion.recv(1024).decode('utf-8')
        print(f"Mensaje recibido: {mensaje_recibido}")
</pre>



<h3 class="wp-block-heading">Código (cliente en la máquina A):</h3>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import socket

# Configurar el cliente
host_servidor = 'dirección_IP_de_B'  # Cambiar a la dirección IP de la máquina B
puerto_servidor = 12345

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as cliente:
    cliente.connect((host_servidor, puerto_servidor))

    # Enviar un mensaje al servidor
    mensaje = "Hola desde el cliente"
    cliente.sendall(mensaje.encode('utf-8'))

print("Mensaje enviado exitosamente.")
</pre>



<h3 class="wp-block-heading">Explicación</h3>



<p>Este ejemplo ilustra la comunicación básica entre dos procesos en máquinas diferentes mediante sockets. Se puede ejecutar el servidor en la máquina B y el cliente en la máquina A. Se debe asegurar de reemplazar &#8216;dirección_IP_de_B&#8217; con la dirección IP real de la máquina B.</p>



<p>Esta práctica refleja un escenario de programación distribuida donde los procesos pueden ejecutarse en diferentes máquinas y comunicarse a través de la red. En entornos más complejos, se podría utilizar bibliotecas específicas de programación distribuida como ZeroMQ, RabbitMQ, o incluso MPI </p>
<p>La entrada <a href="https://www.frexus.dev/post/distribuida/">Distribuida</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/distribuida/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2406</post-id>	</item>
		<item>
		<title>MPI</title>
		<link>https://www.frexus.dev/post/mpi/</link>
					<comments>https://www.frexus.dev/post/mpi/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Thu, 07 Sep 2023 06:11:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[caso de estudio]]></category>
		<category><![CDATA[mpi]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2402</guid>

					<description><![CDATA[<p>Message Passing Interface (MPI) es un estándar para la programación paralela o distribuida, que permite a múltiples procesos (que pueden estar en diferentes computadoras) comunicarse entre sí mediante el envío y recepción de mensajes. Se puede integrarse con lenguajes orientados a objetos como C++ o Python. MPI es particularmente útil en el ámbito de la programación concurrente cuando se trata de desarrollar aplicaciones que requieren un alto rendimiento y escalabilidad en sistemas distribuidos. aquí tienes un ejemplo simple de cómo usar MPI en C para realizar una suma colectiva en un clúster de procesadores: Código Este programa MPI realiza la inicialización del entorno MPI, obtiene el rango y el tamaño del comunicador, y luego define un conjunto de números locales en cada proceso. Luego, utiliza la función MPI_Allreduce para realizar una suma colectiva de estos números y obtener la suma global, que se imprime en cada proceso. Para compilar y ejecutar el programa en un clúster de procesadores usando, por ejemplo, el compilador mpicc: Este ejemplo utiliza Message Passing Interfacpara distribuir la carga de trabajo y realizar una operación colectiva, la suma, entre todos los procesos en el clúster. Cada proceso tiene un conjunto de números locales, y el resultado final es la suma global de todos estos conjuntos.</p>
<p>La entrada <a href="https://www.frexus.dev/post/mpi/">MPI</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-large is-resized"><img loading="lazy" decoding="async" width="683" height="1024" src="https://www.frexus.dev/wp-content/uploads/2024/05/pexels-photo-5496463-683x1024.jpeg" alt="solicitar datos al usuario en python MPI" class="wp-image-2723" style="width:465px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/05/pexels-photo-5496463-683x1024.jpeg 683w, https://www.frexus.dev/wp-content/uploads/2024/05/pexels-photo-5496463-200x300.jpeg 200w, https://www.frexus.dev/wp-content/uploads/2024/05/pexels-photo-5496463-768x1152.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/05/pexels-photo-5496463.jpeg 867w" sizes="auto, (max-width: 683px) 100vw, 683px" /><figcaption class="wp-element-caption">Photo by Pavel Danilyuk on <a href="https://www.pexels.com/photo/person-using-macbook-air-5496463/">Pexels.com</a></figcaption></figure>
</div>


<p><strong>Message Passing Interface (MPI)</strong> es un <strong>estándar para la programación paralela o distribuida</strong>, que permite a múltiples procesos (que pueden estar en diferentes computadoras) comunicarse entre sí mediante el envío y recepción de mensajes.</p>



<p>Se puede integrarse con lenguajes orientados a objetos como C++ o Python.</p>



<ul class="wp-block-list">
<li><strong>Aplicación típica:</strong> programación de alto rendimiento (HPC), como simulaciones científicas o cálculos complejos en clústeres de computadoras.</li>



<li><strong>Ejemplo en C++ con MPI:</strong> Usar <code>MPI_Send()</code> y <code>MPI_Recv()</code> para enviar datos entre nodos de una red.</li>
</ul>



<p></p>



<p>MPI es particularmente útil en el ámbito de la programación concurrente cuando se trata de desarrollar aplicaciones que requieren un alto rendimiento y escalabilidad en sistemas distribuidos.</p>



<p>aquí tienes un ejemplo simple de cómo usar MPI en C para realizar una suma colectiva en un clúster de procesadores:</p>



<h2 class="wp-block-heading">Código</h2>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
#include &lt;stdio.h&gt;
#include &lt;mpi.h&gt;

int main(int argc, char** argv) {
    // Inicializar el entorno MPI
    MPI_Init(&amp;argc, &amp;argv);

    // Obtener el rango y el tamaño del comunicador
    int rank, size;
    MPI_Comm_rank(MPI_COMM_WORLD, &amp;rank);
    MPI_Comm_size(MPI_COMM_WORLD, &amp;size);

    // Definir un array de números en cada proceso
    int local_numbers&#x5B;3] = {rank + 1, rank + 2, rank + 3};
    int global_sum&#x5B;3];

    // Realizar una suma colectiva de los números
    MPI_Allreduce(local_numbers, global_sum, 3, MPI_INT, MPI_SUM, MPI_COMM_WORLD);

    // Imprimir los resultados
    printf(&quot;Proceso %d: Números locales &#x5B;%d, %d, %d], Suma global &#x5B;%d, %d, %d]\n&quot;,
           rank, local_numbers&#x5B;0], local_numbers&#x5B;1], local_numbers&#x5B;2],
           global_sum&#x5B;0], global_sum&#x5B;1], global_sum&#x5B;2]);

    // Finalizar el entorno MPI
    MPI_Finalize();

    return 0;
}
</pre></div>


<p>Este programa MPI realiza la inicialización del entorno MPI, obtiene el rango y el tamaño del comunicador, y luego define un conjunto de números locales en cada proceso. Luego, utiliza la función <code>MPI_Allreduce</code> para realizar una suma colectiva de estos números y obtener la suma global, que se imprime en cada proceso.</p>



<p>Para compilar y ejecutar el programa en un clúster de procesadores usando, por ejemplo, el compilador mpicc:</p>


<div class="wp-block-syntaxhighlighter-code "><pre class="brush: cpp; title: ; notranslate">
mpicc ejemplo_mpi.c -o ejemplo_mpi
mpiexec -n 4 ./ejemplo_mpi
</pre></div>


<p>Este ejemplo utiliza Message Passing Interfacpara distribuir la carga de trabajo y realizar una operación colectiva, la suma, entre todos los procesos en el clúster. Cada proceso tiene un conjunto de números locales, y el resultado final es la suma global de todos estos conjuntos.</p>
<p>La entrada <a href="https://www.frexus.dev/post/mpi/">MPI</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/mpi/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2402</post-id>	</item>
		<item>
		<title>Monitor</title>
		<link>https://www.frexus.dev/post/monitor/</link>
					<comments>https://www.frexus.dev/post/monitor/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Tue, 05 Sep 2023 04:53:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[ejemplo]]></category>
		<category><![CDATA[monitores]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2394</guid>

					<description><![CDATA[<p>Los monitor son una herramienta valiosa en programación concurrente y han sido ampliamente adoptados en diversos contextos para gestionar la concurrencia de manera segura y eficiente. Suponga que se quiere implementar un contador que puede ser incrementado y decrementado por varios hilos simultáneamente, pero se debe asegurar de que estas operaciones sean atómicas y que siempre se respete la exclusión mutua. Codificación Explicación En este ejemplo, la clase MonitorContador encapsula el contador y los métodos (incrementar, decrementar, obtener_valor) que operan sobre él. Se utiliza un cerrojo (mutex) para garantizar la exclusión mutua alrededor de las operaciones críticas. Los dos hilos (hilo_aumentar y hilo_disminuir) realizan incrementos y decrementos en paralelo, pero gracias al monitor, estas operaciones son seguras y el valor final del contador reflejará la suma y resta correctamente.</p>
<p>La entrada <a href="https://www.frexus.dev/post/monitor/">Monitor</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1880" height="1253" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297.jpeg" alt=" monitor down angle photography of red clouds and blue sky" class="wp-image-2395" style="width:363px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297.jpeg 1880w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297-300x200.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297-1024x682.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297-768x512.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297-1536x1024.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-844297-1140x760.jpeg 1140w" sizes="auto, (max-width: 1880px) 100vw, 1880px" /><figcaption class="wp-element-caption">Photo by eberhard grossgasteiger on <a href="https://www.pexels.com/photo/down-angle-photography-of-red-clouds-and-blue-sky-844297/">Pexels.com</a></figcaption></figure>
</div>


<p>Los monitor son una herramienta valiosa en programación concurrente y han sido ampliamente adoptados en diversos contextos para gestionar la concurrencia de manera segura y eficiente.</p>



<p>Suponga que se quiere implementar un contador que puede ser incrementado y decrementado por varios hilos simultáneamente, pero se debe asegurar de que estas operaciones sean atómicas y que siempre se respete la exclusión mutua.</p>



<h2 class="wp-block-heading">Codificación</h2>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading

class MonitorContador:
    def __init__(self):
        self.valor = 0
        self.mutex = threading.Lock()

    def incrementar(self):
        with self.mutex:
            self.valor += 1

    def decrementar(self):
        with self.mutex:
            self.valor -= 1

    def obtener_valor(self):
        with self.mutex:
            return self.valor

# Crear una instancia del monitor
contador_monitor = MonitorContador()

# Definir una función que incrementa el contador
def aumentar_contador():
    for _ in range(1000000):
        contador_monitor.incrementar()

# Definir una función que decrementa el contador
def disminuir_contador():
    for _ in range(1000000):
        contador_monitor.decrementar()

# Crear hilos para incrementar y decrementar el contador
hilo_aumentar = threading.Thread(target=aumentar_contador)
hilo_disminuir = threading.Thread(target=disminuir_contador)

# Iniciar los hilos
hilo_aumentar.start()
hilo_disminuir.start()

# Esperar a que ambos hilos terminen
hilo_aumentar.join()
hilo_disminuir.join()

# Obtener el valor final del contador desde el monitor
valor_final = contador_monitor.obtener_valor()
print("Valor final del contador:", valor_final)
</pre>



<h2 class="wp-block-heading">Explicación</h2>



<p>En este ejemplo, la clase <code>MonitorContador</code> encapsula el contador y los métodos (<code>incrementar</code>, <code>decrementar</code>, <code>obtener_valor</code>) que operan sobre él. Se utiliza un cerrojo (<code>mutex</code>) para garantizar la exclusión mutua alrededor de las operaciones críticas. Los dos hilos (<code>hilo_aumentar</code> y <code>hilo_disminuir</code>) realizan incrementos y decrementos en paralelo, pero gracias al monitor, estas operaciones son seguras y el valor final del contador reflejará la suma y resta correctamente.</p>
<p>La entrada <a href="https://www.frexus.dev/post/monitor/">Monitor</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/monitor/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2394</post-id>	</item>
		<item>
		<title>Exclusión, sincronización y región</title>
		<link>https://www.frexus.dev/post/exclusion-programacion-concurrente/</link>
					<comments>https://www.frexus.dev/post/exclusion-programacion-concurrente/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Mon, 04 Sep 2023 17:39:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[exclusión]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2390</guid>

					<description><![CDATA[<p>La programación concurrente, esencial en entornos de desarrollo modernos, involucra la ejecución simultánea de múltiples hilos o procesos para mejorar la eficiencia y la capacidad de respuesta de un programa. Conceptos clave como la exclusión mutua, las regiones críticas y la sincronización juegan un papel fundamental. La exclusión mutua asegura que solo un hilo acceda a un recurso compartido en un momento dado, evitando así condiciones de carrera y garantizando la coherencia de los datos. Las regiones críticas, por su parte, son secciones de código donde se accede y modifica información compartida, y se implementan para garantizar que estas operaciones críticas se realicen de manera atómica, sin interferencia de otros hilos. La sincronización, coordina la ejecución de hilos para evitar conflictos y lograr un comportamiento predecible, utilizando mecanismos como cerrojos, variables de condición y semáforos. Estos conceptos son esenciales para desarrollar aplicaciones robustas y eficientes en entornos concurrentes. A continuación se muestra unos ejemplos Ejemplo de exclusión mutua Supongamos que se tiene una variable global compartida llamada contador. Se quiere garantizar que varios hilos puedan incrementar este contador sin que se pierdan actualizaciones debido a condiciones de carrera. En este ejemplo, la exclusión mutua se logra utilizando un cerrojo (mutex). La sección crítica es la operación de incremento dentro del bucle. Solo un hilo puede ejecutar esta sección a la vez, asegurando que las actualizaciones al contador sean coherentes. Ejemplo de de Región Crítica Supongamos que se tiene una lista compartida y varios hilos que quieren agregar elementos a esta lista. Se necesita asegurar que la operación de agregar elementos se realice de manera segura. Aquí, la región crítica es la operación de agregar elementos a la lista. El cerrojo (mutex) garantiza que solo un hilo pueda realizar esta operación a la vez, evitando problemas de concurrencia. Ejemplo de Sincronización Suponga que se tiene dos hilos: uno para imprimir números pares y otro para imprimir números impares en orden. Se Necesita sincronizarlos para asegurar que impriman alternadamente en orden. Aquí, se utiliza un objeto de condición (condicion) para sincronizar los hilos. La función notify() señala al otro hilo que puede imprimir, mientras que wait() hace que un hilo espere hasta que sea notificado por el otro. Esto asegura que los números pares e impares se impriman alternadamente en orden.</p>
<p>La entrada <a href="https://www.frexus.dev/post/exclusion-programacion-concurrente/">Exclusión, sincronización y región</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="867" height="1300" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-6322483.jpeg" alt="exclusión a man and a woman communicating through hand gestures" class="wp-image-2391" style="width:283px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-6322483.jpeg 867w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-6322483-200x300.jpeg 200w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-6322483-683x1024.jpeg 683w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-6322483-768x1152.jpeg 768w" sizes="auto, (max-width: 867px) 100vw, 867px" /><figcaption class="wp-element-caption">Photo by cottonbro studio on <a href="https://www.pexels.com/photo/a-man-and-a-woman-communicating-through-hand-gestures-6322483/">Pexels.com</a></figcaption></figure>
</div>


<p>La programación concurrente, esencial en entornos de desarrollo modernos, involucra la ejecución simultánea de múltiples hilos o procesos para mejorar la eficiencia y la capacidad de respuesta de un programa. </p>



<p>Conceptos clave como la exclusión mutua, las regiones críticas y la sincronización juegan un papel fundamental. La <strong>exclusión mutua </strong>asegura que solo un hilo acceda a un recurso compartido en un momento dado, evitando así condiciones de carrera y garantizando la coherencia de los datos. Las <strong>regiones críticas</strong>, por su parte, son secciones de código donde se accede y modifica información compartida, y se implementan para garantizar que estas operaciones críticas se realicen de manera atómica, sin interferencia de otros hilos. La <strong>sincronización</strong>,  coordina la ejecución de hilos para evitar conflictos y lograr un comportamiento predecible, utilizando mecanismos como cerrojos, variables de condición y semáforos. Estos conceptos son esenciales para desarrollar aplicaciones robustas y eficientes en entornos concurrentes. A continuación se muestra unos ejemplos</p>



<h2 class="wp-block-heading">Ejemplo de exclusión mutua</h2>



<p>Supongamos que se tiene una variable global compartida llamada <code>contador</code>. Se quiere garantizar que varios hilos puedan incrementar este contador sin que se pierdan actualizaciones debido a condiciones de carrera.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading

contador = 0
mutex = threading.Lock()

def incrementar():
    global contador
    for _ in range(1000000):
        with mutex:
            contador += 1

# Crear hilos
hilo_1 = threading.Thread(target=incrementar)
hilo_2 = threading.Thread(target=incrementar)

# Iniciar hilos
hilo_1.start()
hilo_2.start()

# Esperar a que ambos hilos terminen
hilo_1.join()
hilo_2.join()

print("Valor final del contador:", contador)
</pre>



<p>En este ejemplo, la exclusión mutua se logra utilizando un cerrojo (<code>mutex</code>). La sección crítica es la operación de incremento dentro del bucle. Solo un hilo puede ejecutar esta sección a la vez, asegurando que las actualizaciones al contador sean coherentes.</p>



<h2 class="wp-block-heading">Ejemplo de <strong>de Región Crítica</strong></h2>



<p>Supongamos que se tiene una lista compartida y varios hilos que quieren agregar elementos a esta lista. Se necesita asegurar que la operación de agregar elementos se realice de manera segura.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading

lista_compartida = []
mutex = threading.Lock()

def agregar_elemento(elemento):
    with mutex:
        lista_compartida.append(elemento)

# Crear hilos
hilo_1 = threading.Thread(target=agregar_elemento, args=("A",))
hilo_2 = threading.Thread(target=agregar_elemento, args=("B",))

# Iniciar hilos
hilo_1.start()
hilo_2.start()

# Esperar a que ambos hilos terminen
hilo_1.join()
hilo_2.join()

print("Lista final:", lista_compartida)
</pre>



<p>Aquí, la región crítica es la operación de agregar elementos a la lista. El cerrojo (<code>mutex</code>) garantiza que solo un hilo pueda realizar esta operación a la vez, evitando problemas de concurrencia.</p>



<h2 class="wp-block-heading"><strong>Ejemplo de Sincronización</strong></h2>



<p>Suponga que se tiene dos hilos: uno para imprimir números pares y otro para imprimir números impares en orden. Se Necesita sincronizarlos para asegurar que impriman alternadamente en orden.</p>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading

mutex = threading.Lock()
condicion = threading.Condition()

def imprimir_pares():
    with mutex:
        for i in range(0, 10, 2):
            print(i)
            condicion.notify()
            condicion.wait()

def imprimir_impares():
    with mutex:
        for i in range(1, 10, 2):
            print(i)
            condicion.notify()
            condicion.wait()

# Crear hilos
hilo_pares = threading.Thread(target=imprimir_pares)
hilo_impares = threading.Thread(target=imprimir_impares)

# Iniciar hilos
hilo_pares.start()
hilo_impares.start()

# Esperar a que ambos hilos terminen
hilo_pares.join()
hilo_impares.join()
</pre>



<p>Aquí, se utiliza un objeto de condición (<code>condicion</code>) para sincronizar los hilos. La función <code>notify()</code> señala al otro hilo que puede imprimir, mientras que <code>wait()</code> hace que un hilo espere hasta que sea notificado por el otro. Esto asegura que los números pares e impares se impriman alternadamente en orden.</p>
<p>La entrada <a href="https://www.frexus.dev/post/exclusion-programacion-concurrente/">Exclusión, sincronización y región</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/exclusion-programacion-concurrente/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2390</post-id>	</item>
		<item>
		<title>Hilos</title>
		<link>https://www.frexus.dev/post/hilos/</link>
					<comments>https://www.frexus.dev/post/hilos/#respond</comments>
		
		<dc:creator><![CDATA[Alfredo de Jesús Gutiérrez]]></dc:creator>
		<pubDate>Sun, 03 Sep 2023 06:55:00 +0000</pubDate>
				<category><![CDATA[post]]></category>
		<category><![CDATA[Ejercicios]]></category>
		<category><![CDATA[programación concurrente]]></category>
		<category><![CDATA[Python]]></category>
		<guid isPermaLink="false">https://www.frexus.dev/?p=2386</guid>

					<description><![CDATA[<p>Ejercicios Codificación Solución 1: Contador Concurrente en Python Explicación Solución 2: Imprimir en Orden en Python Explicación Solución 3: Problema de Productor-Consumidor en Python Explicación</p>
<p>La entrada <a href="https://www.frexus.dev/post/hilos/">Hilos</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></description>
										<content:encoded><![CDATA[<div class="wp-block-image">
<figure class="aligncenter size-full is-resized"><img loading="lazy" decoding="async" width="1880" height="1165" src="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891.jpeg" alt="hilos four thread spools" class="wp-image-2387" style="width:446px;height:auto" srcset="https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891.jpeg 1880w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891-300x186.jpeg 300w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891-1024x635.jpeg 1024w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891-768x476.jpeg 768w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891-1536x952.jpeg 1536w, https://www.frexus.dev/wp-content/uploads/2024/01/pexels-photo-1772891-1140x706.jpeg 1140w" sizes="auto, (max-width: 1880px) 100vw, 1880px" /><figcaption class="wp-element-caption">Photo by Suzy Hazelwood on <a href="https://www.pexels.com/photo/four-thread-spools-1772891/">Pexels.com</a></figcaption></figure>
</div>


<h2 class="wp-block-heading">Ejercicios</h2>



<ul class="wp-block-list">
<li><strong>Contador Concurrente</strong>
<ul class="wp-block-list">
<li>Escribe un programa que utilice dos hilos para incrementar y decrementar un contador compartido. Asegúrate de manejar adecuadamente la exclusión mutua para evitar condiciones de carrera.</li>
</ul>
</li>



<li><strong>Imprimir en Orden</strong>
<ul class="wp-block-list">
<li>Crea tres hilos que impriman &#8220;Uno&#8221;, &#8220;Dos&#8221; y &#8220;Tres&#8221;, respectivamente, en orden. Asegúrate de que cada hilo espere al hilo anterior antes de imprimir su número.</li>
</ul>
</li>



<li><strong>Productor-Consumidor</strong>
<ul class="wp-block-list">
<li>Implementa un problema de productor-consumidor utilizando dos hilos productores y dos hilos consumidores. Utiliza una cola compartida para la comunicación entre productores y consumidores.</li>
</ul>
</li>
</ul>



<h2 class="wp-block-heading">Codificación</h2>



<h4 class="wp-block-heading"><strong>Solución 1: Contador Concurrente en Python</strong></h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading
import time

contador = 0
mutex = threading.Lock()

def incrementar():
    global contador
    for _ in range(1000000):
        with mutex:
            contador += 1

def decrementar():
    global contador
    for _ in range(1000000):
        with mutex:
            contador -= 1

# Crear hilos
hilo_incrementar = threading.Thread(target=incrementar)
hilo_decrementar = threading.Thread(target=decrementar)

# Iniciar hilos
hilo_incrementar.start()
hilo_decrementar.start()

# Esperar a que ambos hilos terminen
hilo_incrementar.join()
hilo_decrementar.join()

print("Valor final del contador:", contador)
</pre>



<h4 class="wp-block-heading">Explicación</h4>



<ul class="wp-block-list">
<li>Se utiliza un contador compartido (<code>contador</code>) que dos hilos (<code>incrementar</code> y <code>decrementar</code>) modifican simultáneamente.</li>



<li>Se utiliza un cerrojo (<code>mutex</code>) para garantizar la exclusión mutua y evitar condiciones de carrera.</li>



<li>Cada hilo realiza un millón de incrementos o decrementos dentro de la sección crítica (dentro del <code>with mutex</code>).</li>



<li>Al final, se imprime el valor final del contador.</li>
</ul>



<h4 class="wp-block-heading"><strong>Solución 2: Imprimir en Orden en Python</strong></h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading

def imprimir_uno():
    print("Uno")

def imprimir_dos():
    print("Dos")

def imprimir_tres():
    print("Tres")

# Crear hilos
hilo_uno = threading.Thread(target=imprimir_uno)
hilo_dos = threading.Thread(target=imprimir_dos)
hilo_tres = threading.Thread(target=imprimir_tres)

# Iniciar hilos en orden
hilo_uno.start()
hilo_uno.join()

hilo_dos.start()
hilo_dos.join()

hilo_tres.start()
hilo_tres.join()
</pre>



<h4 class="wp-block-heading">Explicación</h4>



<ul class="wp-block-list">
<li>Se crean tres funciones (<code>imprimir_uno</code>, <code>imprimir_dos</code>, <code>imprimir_tres</code>) que imprimen diferentes mensajes.</li>



<li>Se crean tres hilos (<code>hilo_uno</code>, <code>hilo_dos</code>, <code>hilo_tres</code>) asociados a cada función.</li>



<li>Los hilos se inician y se espera a que cada uno termine antes de iniciar el siguiente, garantizando que los mensajes se impriman en orden.</li>
</ul>



<h4 class="wp-block-heading"><strong>Solución 3: Problema de Productor-Consumidor en Python</strong></h4>



<pre class="EnlighterJSRAW" data-enlighter-language="python" data-enlighter-theme="" data-enlighter-highlight="" data-enlighter-linenumbers="" data-enlighter-lineoffset="" data-enlighter-title="" data-enlighter-group="">import threading
import queue
import time
import random

cola = queue.Queue(maxsize=5)

def productor():
    for i in range(5):
        item = f"Elemento-{i}"
        cola.put(item)
        print(f"Productor produce: {item}")
        time.sleep(random.uniform(0.1, 0.5))

def consumidor():
    while True:
        item = cola.get()
        print(f"Consumidor consume: {item}")
        time.sleep(random.uniform(0.2, 0.7))

# Crear hilos
hilo_productor_1 = threading.Thread(target=productor)
hilo_productor_2 = threading.Thread(target=productor)
hilo_consumidor_1 = threading.Thread(target=consumidor)
hilo_consumidor_2 = threading.Thread(target=consumidor)

# Iniciar hilos
hilo_productor_1.start()
hilo_productor_2.start()
hilo_consumidor_1.start()
hilo_consumidor_2.start()
</pre>



<h4 class="wp-block-heading">Explicación</h4>



<ul class="wp-block-list">
<li>Se utiliza una cola (<code>cola</code>) para la comunicación entre productores y consumidores.</li>



<li>Hay dos thread productores (<code>hilo_productor_1</code> y <code>hilo_productor_2</code>) y dos thread consumidores (<code>hilo_consumidor_1</code> y <code>hilo_consumidor_2</code>).</li>



<li>Los productores ponen elementos en la cola, mientras que los consumidores los sacan y los imprimen.</li>



<li>El programa sigue ejecutándose indefinidamente, y los thread se pueden interrumpir manualmente.</li>
</ul>
<p>La entrada <a href="https://www.frexus.dev/post/hilos/">Hilos</a> se publicó primero en <a href="https://www.frexus.dev">Frexus</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.frexus.dev/post/hilos/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">2386</post-id>	</item>
	</channel>
</rss>
