Maison  >  Article  >  développement back-end  >  Expérience pratique dans l'application de la programmation simultanée Select Channels Go dans des projets Golang

Expérience pratique dans l'application de la programmation simultanée Select Channels Go dans des projets Golang

王林
王林original
2023-09-27 11:46:41718parcourir

在golang项目中应用Select Channels Go并发式编程的实践经验

Expérience pratique dans l'application de la programmation simultanée Select Channels Go dans les projets Golang, des exemples de code spécifiques sont requis

Introduction :

Avec la demande croissante de programmation simultanée, les instructions et les canaux sélectionnés de Golang sont devenus la première étape pour mettre en œuvre la programmation simultanée outil important. Cet article partagera quelques expériences dans l'application d'instructions et de canaux sélectionnés dans des projets Golang et donnera des exemples de code spécifiques.

  1. Concepts de base

Avant de commencer, comprenons d'abord les concepts de base de certaines instructions et canaux.

  • instruction select : L'instruction select est utilisée pour attendre plusieurs opérations de communication en même temps. Il se bloque jusqu'à ce qu'une des opérations de communication puisse avoir lieu. Si plusieurs opérations de communication sont disponibles en même temps, il en sélectionne une au hasard pour l'exécution.
  • canal : le canal est un type spécial utilisé pour la communication entre plusieurs goroutines. Il peut être utilisé pour envoyer ou recevoir des données.
  1. Expérience pratique

Ce qui suit répertorie quelques expériences pratiques dans l'application d'instructions et de canaux sélectionnés dans des projets Golang, y compris des scénarios courants et des exemples de code spécifiques.

2.1 Sélection multiplexée

Dans Golang, nous pouvons utiliser l'instruction select pour implémenter la sélection multiplexée de plusieurs canaux. Ceci est très utile dans les scénarios où plusieurs opérations de communication doivent être surveillées simultanément. Par exemple, nous devons recevoir des données de deux canaux différents et les fusionner en un seul flux.

func merge(ch1, ch2 <-chan int) <-chan int {
    mergedCh := make(chan int)
    go func() {
        defer close(mergedCh)
        for {
            select {
            case val, ok := <-ch1:
                if !ok {
                    ch1 = nil
                    continue
                }
                mergedCh <- val
            case val, ok := <-ch2:
                if !ok {
                    ch2 = nil
                    continue
                }
                mergedCh <- val
            }
            if ch1 == nil && ch2 == nil {
                break
            }
        }
    }()
    return mergedCh
}

2.2 Traitement du délai d'attente

Parfois, nous devons définir un délai d'attente pour une certaine opération de communication afin d'éviter que d'autres opérations ne soient bloquées trop longtemps. En utilisant les instructions select, nous pouvons facilement implémenter un tel traitement de délai d'attente.

func requestWithTimeout(url string, timeout time.Duration) (string, error) {
    ch := make(chan string)
    go func() {
        // 模拟网络请求
        resp, err := http.Get(url)
        if err != nil {
            log.Println(err)
        }
        defer resp.Body.Close()
        body, _ := ioutil.ReadAll(resp.Body)
        ch <- string(body)
    }()
    select {
    case res := <-ch:
        return res, nil
    case <-time.After(timeout):
        return "", errors.New("request timed out")
    }
}

2.3 Traitement parallèle

Dans certains scénarios, nous devons traiter plusieurs opérations de communication en parallèle jusqu'à ce que toutes les opérations soient terminées. À l’heure actuelle, nous pouvons utiliser des déclarations et des canaux sélectionnés pour y parvenir.

func processInParallel(input []string) []string {
    ch := make(chan string)
    var wg sync.WaitGroup
    for _, item := range input {
        wg.Add(1)
        go func(str string) {
            defer wg.Done()
            // 处理数据
            time.Sleep(time.Second)
            ch <- str
        }(item)
    }
    go func() {
        wg.Wait()
        close(ch)
    }()

    var results []string
    for res := range ch {
        results = append(results, res)
    }
    return results
}

Résumé :

Cet article présente l'expérience pratique de l'application d'instructions et de canaux sélectionnés dans des projets Golang et donne des exemples de code spécifiques. En utilisant des instructions et des canaux de sélection, nous pouvons plus facilement implémenter des scénarios tels que la sélection multiplex, le traitement des délais d'attente et le traitement parallèle. Ce sont des outils très utiles et puissants en programmation simultanée dans Golang. J'espère que ces expériences seront utiles à tout le monde dans la pratique.

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