Maison > Article > développement back-end > Comment limiter efficacement les routines Go simultanées avec les canaux ?
Lorsque vous travaillez avec une liste d'URL qui doivent être traitées de manière asynchrone, il est souvent souhaitable de limiter le nombre de goroutines simultanées à éviter des ressources trop importantes. La solution consiste à créer un canal délimité qui contrôle le nombre maximum de goroutines pouvant s'exécuter simultanément.
Dans la tentative initiale, un canal tamponné de taille parallèle a été créé :
<code class="go">results := make(chan string, *parallel)</code>
L'intention était que lorsque le canal de résultats était plein, le programme se bloquait jusqu'à ce qu'une valeur soit lue dans le canal, permettant ainsi la génération d'une autre goroutine. Cependant, cette approche ne limite pas efficacement le nombre de goroutines, car le programme principal ne bloque pas lorsque toutes les URL ont été traitées.
Une solution plus efficace consiste à créer un fichier fixe nombre de goroutines de travail :
<code class="go">for i := 0; i < *parallel; i++ { wg.Add(1) go func() { defer wg.Done() for url := range urls { worker(url, client, results) } }() }</code>
Dans cette solution, les goroutines sont chargées de récupérer les URL d'un canal et de les traiter. Le canal est alimenté par les URL d'une goroutine d'alimentation, et une fois que toutes les URL sont récupérées, la goroutine d'alimentation ferme le canal, signalant aux travailleurs de terminer leurs tâches.
Une goroutine distincte surveille l'état d'achèvement du travailleur. goroutines, fermant le canal des résultats lorsque tous les travailleurs ont terminé. Cette approche limite efficacement le nombre de goroutines en cours d'exécution au nombre parallèle spécifié.
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!