Campus Sonora Norte
Actividad 5.3
“Comunicación entre procesos”
Unidad de Formación : Implementación de métodos computacionales
Docente: M. C. Baldomero Olvera Villanueva
Grupo: 601
Equipo:
Jesús Felipe Bastidas Valenzuela (A01255206)
Jorge Antonio Flores Hernández (A01254623)
Jonathan Uziel Medina Rodríguez (A01255048)
Manuel Nicolás Pacheco Peralta (A01255150)
Fecha de Entrega:
Jueves 5 de junio de 2025.
Descripción:
El problema Productor-Consumidor consiste en que se necesita encontrar una
manera en la que el búfer sea consistente y que un sistema pueda correr de manera
fluida, sin que sea bloqueado ni que sus datos no se corrompan. Para resolver este
problema se crean dos procesos: productor y consumidor. El productor crea los
datos que se almacenan en el búfer, mientras que el consumidor saca cada dato dentro
del búfer para procesarlo. Cada proceso se debe sincronizar, por lo que se necesita un
semáforo que indique el turno de cada proceso para interactuar con el búfer cuando
está lleno o vacío, un mutex que indica qué proceso interactúa con el búfer y monitoreo
de un lenguaje nativo para la concurrencia. En esta actividad se desarrollaron dos
soluciones a este problema de manera secuencial y paralela.
Requerimientos:
● Python 3 (versión 3.13.0 recomendada).
● Aplicación IDE que pueda correr programas de Python 3.
● Librería Threading (incluida con Python 3).
Funciones:
● Función que crea y almacena dentro del stock, los productos producidos por los
productores en el programa secuencial:
○ producer(): Esta función consiste en añadir un producto dentro de un
stock, a través del uso de un arreglo en forma de simulación, donde el
productor crea un producto y lo pone a la venta. Esta función no tiene una
entrada de valores y la salida solamente dice que producto se puso en
stock. No se necesita ninguna postcondición. La complejidad
computacional es O(n) debido a que un bucle dentro de la función debe
reiterarse en n veces.
● Función que crea y almacena dentro del stock, los productos producidos por los
productores en el programa paralelo:
○ consumer(): Esta función consiste en sacar un producto del stock, a
través del uso de un arreglo en forma de simulación, donde el consumidor
adquiere un producto y lo saca del stock. Esta función no tiene una
entrada de valores y la salida solamente dice que producto se consumió.
No se necesita ninguna postcondición. La complejidad computacional es
O(n) debido a que un bucle dentro de la función debe reiterarse en n
veces.
● Función que saca los productos del stock, por que un consumidor los consumió,
en el programa secuencial:
○ producer(): Esta función consiste en añadir un producto dentro de un
stock, a través del uso de un arreglo en forma de simulación, donde el
productor crea un producto y lo pone a la venta. Esta función no tiene una
entrada de valores y la salida solamente dice que producto se puso en
stock. No se necesita ninguna postcondición. La complejidad
computacional es O(n) debido a que un bucle dentro de la función debe
reiterarse en n veces.
● Función que saca los productos del stock, por que un consumidor los consumió,
en el programa secuencial:
○ consumer(): Esta función consiste en sacar un producto del stock, a
través del uso de un arreglo en forma de simulación, donde el consumidor
adquiere un producto y lo saca del stock. Esta función no tiene una
entrada de valores y la salida solamente dice que producto se consumió.
No se necesita ninguna postcondición. La complejidad computacional es
O(n) debido a que un bucle dentro de la función debe reiterarse en n
veces.
Caso de prueba:
En este caso de prueba se comparan los resultados obtenidos en cada programa
cuando el tamaño del búfer es de 5 datos.
Resultado del Tiempo de Resultado del programa Tiempo de
programa ejecución paralelo ejecución
secuencia (secuencial) (paralelo)
Productor 0.0016 segundos [+] Productor produjo: 0 0.0008 segundos
produjo: 0 [-] Consumidor consumió:
Productor 0
produjo: 1 [+] Productor produjo: 1
Productor [-] Consumidor consumió:
produjo: 2 1
Productor [+] Productor produjo: 2
produjo: 3 [-] Consumidor consumió:
Productor 2
produjo: 4 [+] Productor produjo: 3
Consumidor [-] Consumidor consumió:
consumio: 0 3
Consumidor [+] Productor produjo: 4
consumio: 1 [-] Consumidor consumió:
Consumidor 4
consumio: 2 [+] Productor produjo: 5
Consumidor [-] Consumidor consumió:
consumio: 3 5
Consumidor [+] Productor produjo: 6
consumio: 4 [+] Productor produjo: 7
[-] Consumidor consumió:
6
[+] Productor produjo: 8
[-] Consumidor consumió:
7
[+] Productor produjo: 9
[-] Consumidor consumió:
8
[-] Consumidor consumió:
9
Reflexión:
● Jorge Antonio Flores Hernández:
A través del desarrollo de esta actividad comprendí de manera práctica el
funcionamiento del problema clásico de Productor-consumidor, así como la
importación de la sincronización de sistemas concurrentes. Aprendí como los
semáforos y los mutex permiten coordinar adecuadamente el acceso a recursos
compartidos, como el buffer, para evitar condiciones de carrera, bloqueos y
corrupción de datos. También entiendo las diferencias entre implementación
secuencial y una paralela, reconociendo como el uso de hilos puede mejorar el
rendimiento y la eficiencia del sistema cuando se manejan múltiples tareas
simultáneamente. Esta actividad me permitió aplicar conceptos fundamentales
de concurrencia en Python y reforzar mis habilidades en programación orientada
a la solución de problemas del mundo real.
● Jesús Felipe Bastidas Valenzuela:
Durante esta actividad se puede ver la importancia de la programación
concurrente, llevada a cabo en un caso real, en nuestro ejemplo sería
Productor-Consumidor, donde se simula, la venta y compra de productos. La
programación concurrente hace que el escenario a estudiar se refleje de una
forma más realista. Uno de los puntos más importantes a considerar de este tipo
de programación es que al emplearla de manera correcta, podemos eficientizar
un proceso con una diferencia abismal a comparación de la convencional
(programación secuencial).
● Jonathan Uziel Medina Rodríguez:
En esta actividad pude aprender sobre la importancia del patrón
Productor-Consumidor, en donde se rige el comportamiento de los procesos, de
tal manera que se turnen para poder acceder a un archivo o la memoria de búfer
para proteger la integridad de los datos. También este patrón es necesario para
que no se sature el búfer y haya un productor que pueda añadir datos cuando el
búfer no esté lleno y que el consumidor no trate de buscar datos para consumir
cuando el búfer está vacío.
● Manuel Nicolás Pacheco Peralta:
Esta actividad nos permitió entender de manera práctica cómo se gestiona la
comunicación entre procesos en sistemas concurrentes, resaltando la
importancia de la interacción Productor-Consumidor. Lejos de ser solo una
estructura teórica, este modelo representa problemas reales que enfrentan
muchas aplicaciones modernas, desde plataformas de streaming hasta sistemas
IoT. Implementar versiones secuencial y paralela nos ayudó a ver los beneficios
del paralelismo así como los desafíos asociados con él, tales como
interbloqueos. Aprendimos lo crucial que es usar correctamente mecanismos
como semáforos y mutex para asegurar un flujo coordinado de datos. Esta
experiencia reforzó no solo nuestro conocimiento técnico sino también nuestra
capacidad para crear soluciones seguras, eficientes y escalables en entornos
multitarea.
Referencias:
Arquitectura de productor/consumidor en LabVIEW. (2025, 17 febrero). NI. Recuperado
el 2 de junio de 2025, de
[Link]
[Link]
Brownlee, J. (2022, 15 abril). Thread Producer-Consumer Pattern in Python. Super
Fast Python. Recuperado el 19 de mayo de 2025, de
[Link]
GeeksforGeeks. (2024, 24 julio). Producer Consumer Problem using Semaphores | Set
1. Recuperado el 19 de mayo de 2025, de
[Link]
set-1/
GeeksforGeeks. (2025, 10 enero). Producer Consumer Problem in C. Recuperado el
19 de mayo de 2025, de
[Link]
Sharma, Y. (2021, 28 junio). Producer-Consumer Problem in Python. AskPython.
Recuperado el 19 de mayo de 2025, de
[Link]