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.
Avant de commencer, comprenons d'abord les concepts de base de certaines instructions et canaux.
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!