Maison >développement back-end >Golang >Modèle de concurrence Fan-In Fan-Out dans Go : un guide complet
1. Exécutez chaque exemple : Ne vous contentez pas de lire le code. Tapez-le, exécutez-le et observez le comportement.⚠️ Comment s'y prendre pour cette série ?
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é.
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 :
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.
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 :
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-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
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>
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!