Maison >développement back-end >Golang >Méthodes pour améliorer la qualité du code de la programmation simultanée Select Channels Go dans Golang

Méthodes pour améliorer la qualité du code de la programmation simultanée Select Channels Go dans Golang

WBOY
WBOYoriginal
2023-09-27 11:49:07657parcourir

提升golang中Select Channels Go并发式编程的代码质量方法

Méthodes pour améliorer la qualité du code de la programmation simultanée Select Channels Go dans Golang

Introduction :
Golang est un langage de programmation puissant qui est particulièrement efficace pour gérer la concurrence. Parmi eux, l'instruction select et le mécanisme de canal sont largement utilisés dans la programmation simultanée, nous offrant un moyen élégant et efficace de traiter les problèmes de concurrence. Cependant, lors de l’écriture de code simultané, il existe certains pièges et problèmes courants dont nous devons être conscients pour garantir la qualité et la fiabilité de notre code. Cet article présentera quelques méthodes pour améliorer la qualité du code concurrent écrit à l'aide de Select et Channels dans Golang, et fournira des exemples de code spécifiques à titre de référence.

1. Évitez les blocages
Les blocages sont un problème courant lors de l'utilisation des canaux et des instructions sélectionnées. Pour éviter une impasse, nous devons nous assurer que chaque goroutine peut envoyer et recevoir des données avec succès. Voici quelques façons d'éviter les blocages :

  1. Utilisez un canal mis en mémoire tampon : lors de la déclaration d'un canal, vous pouvez définir une taille de tampon pour garantir que les opérations d'envoi et de réception peuvent être effectuées immédiatement. Par exemple :

    ch := make(chan int, 1) // 声明带有缓冲区大小为1的Channel
  2. Utilisez la branche par défaut de l'instruction select : en ajoutant la branche par défaut dans l'instruction select, vous pouvez effectuer l'action par défaut lorsque les données ne peuvent pas être envoyées ou reçues. Par exemple :

    select {
      case ch <- data:
     // 发送数据成功
      case <-time.After(time.Second):
     // 超时处理
      default:
     // 默认操作
    }
  3. Utiliser l'envoi et la réception avec délai d'attente : utilisez la minuterie dans le package de temps pour définir le délai d'expiration de l'opération d'envoi ou de réception. Par exemple :

    select {
      case ch <- data: // 发送数据
      case <-time.After(time.Second): // 在1秒后执行超时处理
    }

2. Utilisez les instructions select de manière appropriée
Lorsque vous écrivez du code avec des instructions select, vous devez prêter attention à certaines bonnes pratiques pour garantir la lisibilité et l'efficacité du code.

  1. Ne gérer qu'un seul cas : chaque instruction select ne peut gérer qu'un seul cas, donc le traitement de plusieurs cas dans une seule instruction select conduit souvent à une confusion de code. Si vous devez gérer plusieurs cas, ils doivent être divisés en plusieurs instructions de sélection. Par exemple :

    select {
      case <-ch1:
     // 处理Case 1
      case <-ch2:
     // 处理Case 2
    }
    
    select {
      case <-ch3:
     // 处理Case 3
      case <-ch4:
     // 处理Case 4
    }
  2. Utilisez la branche par défaut pour les opérations non bloquantes : lorsque vous utilisez l'instruction select, vous pouvez définir un certain cas sur une opération non bloquante pour garantir que le code ne sera pas bloqué car un certain cas ne peut pas être exécuté. Par exemple :

    select {
      case <-ch1:
     // 处理Case 1
      case <-ch2:
     // 处理Case 2
      default:
     // 非阻塞操作
    }
  3. Utiliser la boucle for et briser la sortie : lorsque vous utilisez une instruction select, vous pouvez l'envelopper dans une boucle for pour exécuter l'instruction select plusieurs fois. Utilisez l'instruction break pour quitter une boucle lorsqu'une certaine condition est remplie. Par exemple :

    for {
      select {
     case <-ch1:
       // 处理Case 1
     case <-ch2:
       // 处理Case 2
     case <-done:
       // 退出循环
       break
      }
    }

3. Utilisez des canaux pour le partage et la synchronisation des données

  1. Partage de données : le mécanisme Channel de Golang peut être utilisé pour partager des données entre des goroutines. En envoyant des données à un canal, d'autres goroutines peuvent recevoir des données du canal. L'utilisation de canaux pour le partage de données peut efficacement éviter les conditions de concurrence et les conflits de données.
  2. Synchronisation des données : le canal peut également être utilisé pour coordonner l'ordre des opérations entre plusieurs goroutines. En utilisant un canal mis en mémoire tampon ou en définissant un sémaphore de canal approprié, vous pouvez vous assurer que chaque goroutine attend la fin des autres goroutines avant de remplir des conditions spécifiques.

Ce qui suit est un exemple de code qui montre comment utiliser Channel pour le partage et la synchronisation des données :

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        result := j * 2
        results <- result
    }
}

func main() {
    numJobs := 10
    jobs := make(chan int, numJobs)
    results := make(chan int, numJobs)

    // 启动worker goroutine
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // 发送任务到jobs Channel
    for j := 1; j <= numJobs; j++ {
        jobs <- j
    }
    close(jobs)

    // 接收结果
    for r := 1; r <= numJobs; r++ {
        result := <-results
        fmt.Println(result)
    }
}

Dans le code ci-dessus, nous utilisons deux canaux pour réaliser le partage et la synchronisation des données. Le canal jobs est utilisé pour recevoir les tâches et le canal results est utilisé pour recevoir les résultats du traitement. Utilisez le mot-clé go pour démarrer plusieurs goroutines de travail afin de traiter les tâches et d'envoyer les résultats au canal de résultats. Dans la fonction principale, nous envoyons la tâche au canal des tâches et recevons les résultats du traitement dans le canal des résultats.

Conclusion : 
Dans Golang, l'utilisation d'instructions select et du mécanisme Channel pour la programmation simultanée est un moyen très puissant et flexible. En évitant les blocages, en utilisant rationnellement les instructions select et en utilisant des canaux pour le partage et la synchronisation des données, nous pouvons améliorer la qualité et la fiabilité du code concurrent de Golang. Dans le même temps, il convient de prêter attention à la sélection de modèles de concurrence et de stratégies de planification appropriés pour répondre aux besoins réels et aux exigences de performances.

Référence :

  • Go par exemple : sélectionnez
  • La spécification du langage de programmation Go

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