"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Productor/Consumidor

Productor/Consumidor

Publicado el 2024-07-31
Navegar:123

Definición

Consideramos dos procesos, denominados “productor” y “consumidor”, respectivamente. El productor es un proceso cíclico y cada vez que recorre su ciclo produce una determinada porción de información, la cual debe ser procesada por el consumidor. El consumidor también es un proceso cíclico y cada vez que pasa por su ciclo puede procesar la siguiente información, tal como fue producida por el productor. Un ejemplo sencillo lo da un proceso computacional, que produce como “porciones de información” imágenes de tarjetas perforadas que se perforan con una tarjeta perforada, que desempeña el papel del consumidor.[1]

Producer/Consumer (Produtor/Consumidor)

Explicación

Un productor crea artículos y los almacena en una estructura de datos, mientras que un consumidor elimina artículos de esa estructura y los procesa.

Si el consumo es mayor que la producción, el buffer (estructura de datos) se vacía y el consumidor no tiene nada que consumir
Si el consumo es menor que producción, el buffer se llena y el productor no puede agregar más artículos. Este es un problema clásico llamado búfer limitado.

Contextualización del problema

Supongamos que tenemos un productor que publica un correo electrónico en el búfer y un consumidor que consume el correo electrónico del búfer y muestra un mensaje que indica que se envió un correo electrónico con la nueva contraseña de acceso para el correo electrónico proporcionado.

Ir implementación

package main

import (
    "fmt"
    "os"
    "strconv"
    "sync"
    "time"
)

type buffer struct {
    items []string
    mu    sync.Mutex
}

func (buff *buffer) add(item string) {
    buff.mu.Lock()
    defer buff.mu.Unlock()
    if len(buff.items) 



Explicando la implementación

  • Primero, creamos una estructura llamada buffer, que contiene una matriz de cadenas llamadas items y un mecanismo de control similar a mutex, llamado mu, para administrar el acceso concurrente.
  • Tenemos dos funciones: una llamada agregar, que básicamente agrega un elemento al buffer, siempre que haya espacio disponible, ya que la capacidad del buffer es de solo 5 elementos; y otra llamada get, que, si hay elementos en el búfer, devuelve el primer elemento y elimina ese elemento del búfer.
  • El Productor básicamente toma el índice del bucle y lo concatena en una cadena llamada str, que contiene el índice y un dominio de correo electrónico ficticio, y lo agrega al búfer. Se agregó un intervalo de tiempo para simular un retraso.
  • El consumidor solicita un elemento del búfer, si tiene al menos un elemento. Luego el Consumidor muestra un mensaje en pantalla informando que se envió un correo electrónico con la nueva contraseña de acceso al artículo que se publicó en el buffer.

Enlace de código: https://github.com/jcelsocosta/race_condition/blob/main/producerconsumer/buffer/producerconsumer.go

Referencia

  1. https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123.html#4.1. Usos típicos del semáforo general.

Bibliografía

https://www.cin.ufpe.br/~cagf/if677/2015-2/slides/08_Concorrencia (Jorge).pdf

Declaración de liberación Este artículo se reproduce en: https://dev.to/celso/producerconsumer-produtorconsumidor-1jok?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3