Maison >développement back-end >Golang >Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet

Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet

Patricia Arquette
Patricia Arquetteoriginal
2025-01-07 22:24:41551parcourir

⚠️ Comment s'y prendre pour cette série ?

1. Exécutez chaque exemple : Ne vous contentez pas de lire le code. Tapez-le, exécutez-le et observez le comportement.
2. Expérimentez et cassez des choses : Supprimez les mises en veille et voyez ce qui se passe, modifiez la taille des tampons de canal, modifiez le nombre de goroutines.
Casser des choses vous apprend comment elles fonctionnent
3. Raison concernant le comportement : Avant d'exécuter du code modifié, essayez de prédire le résultat. Lorsque vous constatez un comportement inattendu, faites une pause et réfléchissez à pourquoi. Contestez les explications.
4. Construire des modèles mentaux : Chaque visualisation représente un concept. Essayez de dessiner vos propres diagrammes pour le code modifié.

Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet

Dans notre article précédent, nous avons exploré le modèle de concurrence Pipeline, les éléments constitutifs des modèles de concurrence Fan-In et Fan-Out. Vous pouvez le lire ici :

Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet

Modèle de concurrence de pipeline dans Go : un guide visuel complet

Souvik Kar Mahapatra ・ 29 décembre 24

#aller #tutoriel #programmation #architecture

Dans cet article, nous aborderons le Modèle d'entrée et de sortie et essaierons de les visualiser. Alors préparons-nous car nous serons présents tout au long du processus.

gear up

Évolution à partir du modèle de pipeline

Le modèle fan-in-fan-out est une évolution naturelle du modèle pipeline. Alors qu'un pipeline traite les données de manière séquentielle à travers les étapes, le fan-in-fan-out introduit des capacités de traitement parallèle. Visualisons comment cette évolution se produit :

evolution of pipeline concurrency pattern to fan in & fan out concurrency pattern

Modèle de répartition d'entrée et de sortie

Imaginez une cuisine de restaurant pendant les heures de pointe. Lorsque les commandes arrivent, plusieurs cuisiniers travaillent simultanément sur différents plats (fan-out). Au fur et à mesure qu'ils terminent les plats, ils se réunissent au comptoir de service (fan-in).

Fan in Fan out concurrency pattern visualized

Comprendre la diffusion

Fan-out consiste à répartir le travail sur plusieurs goroutines pour traiter les données en parallèle. Pensez-y comme à diviser une tâche importante en morceaux plus petits sur lesquels vous pouvez travailler simultanément. Voici un exemple simple :

func fanOut(input 

<h3>
  
  
  Comprendre le fan-in
</h3>

<p>Fan-in est l'opposé du fan-out : il combine plusieurs canaux d'entrée en un seul canal. C'est comme un entonnoir qui rassemble les résultats de tous les travailleurs en un seul flux. Voici comment nous le mettons en œuvre :<br>
</p>
<pre class="brush:php;toolbar:false">func fanIn(inputs ...


<p>Rassemblons tout cela avec un exemple complet qui traite les nombres en parallèle :<br>
</p>
<pre class="brush:php;toolbar:false">func main() {
    // Create our input channel
    input := make(chan int)

    // Start sending numbers
    go func() {
        defer close(input)
        for i := 1; i 

<h2>
  
  
  Pourquoi utiliser le modèle Fan-in-fan-out ?
</h2>

<p><strong>Utilisation optimale des ressources</strong></p>

<p>Le modèle répartit naturellement le travail entre les ressources disponibles, ce qui évite les ressources inutilisées et maximise le débit.<br>
</p>
<pre class="brush:php;toolbar:false">// Worker pool size adapts to system resources
numWorkers := runtime.NumCPU()
if numWorkers > maxWorkers {
    numWorkers = maxWorkers // Prevent over-allocation
}

Performances améliorées grâce à la parallélisation

  • Dans l'approche séquentielle, les tâches sont traitées les unes après les autres, créant un temps d'exécution linéaire. Si chaque tâche prend 1 seconde, le traitement de 4 tâches prend 4 secondes.
  • Ce traitement parallèle réduit le temps d'exécution total à environ (tâches totales / nombre de travailleurs) les frais généraux. Dans notre exemple, avec 4 travailleurs, nous traitons toutes les tâches en 1,2 seconde environ au lieu de 4 secondes.
func fanOut(tasks []Task) {
    numWorkers := runtime.NumCPU() // Utilize all available CPU cores
    workers := make([]

<h2>
  
  
  Cas d'utilisation réels
</h2>

<p><strong>Pipeline de traitement d'Modèle de concurrence Fan-In Fan-Out dans Go : un guide complets</strong></p>

<p>C'est comme une mise à niveau de notre article sur le modèle de pipeline, nous devons traiter plus rapidement et avoir des routines go dédiées pour chaque processus :</p><p><img src="https://img.php.cn/upload/article/000/000/000/173625991579012.png" alt="Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet processing pipeline with fan in and fan out pattern" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>

<p><strong>Pipeline Web Scraper</strong><br>
Le web scraping est un autre cas d’utilisation parfait pour le fan-in-fan-out.</p>

<p><img src="https://img.php.cn/upload/article/000/000/000/173625991836275.png" alt="Web scraping is another perfect use case for fan-in fan-out" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>

<p>Le modèle fan-in-fan-out brille vraiment dans ces scénarios car il :</p>

  • Gère automatiquement la simultanéité via les mécanismes de canal de Go
  • Fournit une contre-pression naturelle lorsque le traitement est plus lent que l'ingestion
  • Permet une mise à l'échelle facile en ajustant le nombre de travailleurs
  • Maintient la résilience du système grâce à une gestion des erreurs isolées

Principes de gestion des erreurs

Fail Fast : détectez et gérez les erreurs dès le début du pipeline

Essayez d'effectuer toutes sortes de validations avant ou au début du pipeline pour vous assurer qu'il n'échoue pas sur toute la ligne, car cela évite de gaspiller des ressources sur un travail non valide qui échouerait plus tard. C'est particulièrement crucial dans les modèles de distribution en mode éventail, car des données non valides pourraient bloquer les travailleurs ou gaspiller la capacité de traitement parallèle.

Cependant, ce n'est pas une règle stricte et cela dépend fortement de la logique métier. Voici comment nous pouvons le mettre en œuvre dans nos exemples concrets :

func fanOut(input 


<p>et<br>
</p>
<pre class="brush:php;toolbar:false">func fanIn(inputs ...


<p>Remarque ! erreur chez un travailleur, l'autre ne s'arrête pas, ils continuent à traiter et cela nous amène au 2ème principe</p>
<h3>
  
  
  Isoler les échecs : l'erreur d'un travailleur ne devrait pas affecter les autres
</h3>

<p>Dans un système de traitement parallèle, une mauvaise tâche ne devrait pas faire tomber l'ensemble du système. Chaque travailleur doit être indépendant.<br>
</p>
<pre class="brush:php;toolbar:false">func main() {
    // Create our input channel
    input := make(chan int)

    // Start sending numbers
    go func() {
        defer close(input)
        for i := 1; i 

<h4>
  
  
  Nettoyage des ressources : nettoyage approprié des erreurs
</h4>

<p>Les fuites de ressources lors du traitement parallèle peuvent rapidement dégénérer en problèmes à l’échelle du système. Un bon nettoyage est essentiel.</p>

<hr>

<p>Cela conclut notre plongée profonde dans le modèle Fan-In & Fan-Out ! Dans la prochaine étape, nous explorerons le <strong>modèle de concurrence des pools de travailleurs</strong>, dont nous avons eu un aperçu dans cet article. Comme je l'ai dit, nous éliminons progressivement les dépendances avant de passer à la suivante.</p>

<p>Si vous avez trouvé cet article utile, si vous avez des questions ou si vous souhaitez partager vos propres expériences avec ce modèle, j'aimerais avoir de vos nouvelles dans les commentaires ci-dessous. Vos idées et vos questions contribuent à rendre ces explications encore meilleures pour tout le monde.</p>

<p>Si vous avez manqué le guide visuel de la goroutine et des chaînes de Golang, consultez-le ici :</p>


<div>
  
    <div>
      <img src="https://img.php.cn/upload/article/000/000/000/173625990185651.png" alt="Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet" loading="lazy">
    </div>
<div>
      <h2>Comprendre et visualiser les Goroutines et les canaux en Golang</h2>
      <h3>Souvik Kar Mahapatra ・ 20 décembre 24</h3>
      <div>
        #aller
        #programmation
        #apprentissage
        #tutoriel
      </div>
    </div>
  
</div>



<p>Restez à l'écoute pour plus de modèles de concurrence Go ! ?</p>

<p><img src="https://img.php.cn/upload/article/000/000/000/173625992371812.gif" alt="Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet" loading="lazy"    style="max-width:90%"  style="max-width:90%"></p>


          

            
  

            
        

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn