"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Producteur/Consommateur

Producteur/Consommateur

Publié le 2024-07-31
Parcourir:285

Définition

Nous considérons deux processus, appelés respectivement « producteur » et « consommateur ». Le producteur est un processus cyclique et chaque fois qu'il parcourt son cycle, il produit une certaine partie d'informations qui doivent être traitées par le consommateur. Le consommateur est également un processus cyclique et chaque fois qu'il parcourt son cycle, il peut traiter l'information suivante, telle qu'elle a été produite par le producteur. Un exemple simple est donné par un processus informatique, qui produit sous forme de « portions d'information » des images de cartes perforées devant être perforées par une carte perforée, qui joue le rôle du consommateur.[1]

Producer/Consumer (Produtor/Consumidor)

Explication

Un producteur crée des éléments et les stocke dans une structure de données, tandis qu'un consommateur supprime des éléments de cette structure et les traite.

Si la consommation est supérieure à la production, le tampon (structure de données) se vide et le consommateur n'a rien à consommer
Si la consommation est inférieure à la production, le tampon se remplit et le producteur ne peut pas ajouter d'articles supplémentaires. Il s'agit d'un problème classique appelé tampon limité.

Contextualisation du problème

Supposons que nous ayons un producteur qui publie un e-mail dans le tampon et un consommateur qui consomme l'e-mail du tampon et affiche un message indiquant qu'un e-mail a été envoyé avec le nouveau mot de passe d'accès pour l'e-mail fourni.

Aller à la mise en œuvre

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) 



Expliquer la mise en œuvre

  • Tout d'abord, nous créons une structure appelée buffer, qui contient un tableau de chaînes appelé items et un mécanisme de contrôle de type mutex, appelé mu, pour gérer les accès simultanés.
  • Nous avons deux fonctions : l'une appelée add, qui ajoute essentiellement un élément au tampon, tant qu'il y a de l'espace disponible, puisque la capacité du tampon n'est que de 5 éléments ; et un autre appel get, qui, s'il y a des éléments dans le tampon, renvoie le premier élément et supprime cet élément du tampon.
  • Le Producer prend essentiellement l'index de la boucle et le concatène en une chaîne appelée str, qui contient l'index et un domaine de messagerie factice, et l'ajoute au tampon. Un intervalle de temps a été ajouté pour simuler un retard.
  • Consumer demande un élément au tampon, s'il contient au moins un élément. Le Consommateur affiche alors un message à l'écran l'informant qu'un email a été envoyé avec le nouveau mot de passe d'accès à l'élément publié dans le buffer.

Lien du code : https://github.com/jcelsocosta/race_condition/blob/main/producerconsumer/buffer/producerconsumer.go

Référence

  1. https://www.cs.utexas.edu/~EWD/transcriptions/EWD01xx/EWD123.html#4.1. Utilisations typiques du sémaphore général.

Bibliographie

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

Déclaration de sortie Cet article est reproduit sur : https://dev.to/celso/producerconsumer-produtorconsumidor-1jok?1 En cas de violation, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3