Table des matières
Contenu de la question
Solution de contournement
Maison développement back-end Golang Erreur fatale : tous les goroutines dorment - impasse ! Erreur d'exécution

Erreur fatale : tous les goroutines dorment - impasse ! Erreur d'exécution

Feb 10, 2024 pm 04:42 PM
go语言

致命错误:所有 goroutine 都在睡觉 - 死锁!错误执行

l'éditeur php Strawberry vous présentera une erreur de programmation courante dans cet article : erreur fatale : "Toutes les goroutines dorment - blocage ! Erreur d'exécution". C'est l'une des erreurs courantes du langage Go et l'un des défis que les développeurs rencontrent souvent. Dans cet article, nous expliquerons en détail la cause et la solution de cette erreur pour aider chacun à mieux comprendre et gérer ce problème. Que vous soyez débutant ou développeur expérimenté, vous obtiendrez de précieuses informations et conseils grâce à cet article. Explorons ensemble !

Contenu de la question

Je suis très nouveau dans la concurrence en go, j'ai donc essayé un exemple avec des canaux et des goroutines. Je veux le modèle producteur-consommateur. La fonction producteur donne toujours des chaînes aléatoires et le consommateur les modifie en les mettant en majuscules. Je souhaite l'exécuter pendant une durée limitée (2 secondes).

package main

import (
    "fmt"
    "math/rand"
    "strings"
    "time"
)

func producer(x []string, c chan string) {
    i := 1
    for i > 0 {
        randomIndex := rand.Intn(len(x))
        pick := x[randomIndex]
        c <- pick
    }
}

func consumer(x string, c chan string) {
    x1 := strings.ToUpper(x)
    c <- x1
}

func main() {

    s := []string{"one", "two", "three", "four"}
    c1 := make(chan string)
    d1 := make(chan string)
    go producer(s, c1)
    go consumer(<-c1, d1)

    stop := time.After(2000 * time.Millisecond)
    for {
        select {
        case <-stop:
            fmt.Println("STOP AFTER 2 SEC!")
            return
        default:
            fmt.Println(<-d1)
            time.Sleep(50 * time.Millisecond)
        }
    }
}
Copier après la connexion

Je ne reçois qu'un seul élément du tableau et quelques erreurs. Quels changements doivent être apportés pour que cet exemple fonctionne ?

Sortie :

Deux

ERREUR FATALE : tous les goroutines dorment - impasse !

goroutine 1 [chan recevoir] : main.main()

Coroutine 6 [chan send] : main.producter({0xc00004e040, 0x4, 0x0?}, 0x0?) Créé par principal. principal Statut de sortie 2

Solution de contournement

Votre consommateur doit fonctionner en boucle, cela a déjà été mentionné.

Modifiez le premier paramètre de consumer pour qu'il soit chan字符串 au lieu d'une chaîne. De cette façon, le producteur peut continuer à écrire sur cette chaîne pour que le consommateur puisse publier sur une autre chaîne jusqu'à l'expiration du délai.

func consumer(consumechan chan string, outch chan string) {
    for {
        select {
        case s := <- consumechan:
            s = strings.toupper(s)
            outch <- s
        }
    }
}
Copier après la connexion

Maintenant, lors de l'appel de go consumer() 之前的主函数中,您正在等待生产者对 c1 通道的第一个响应。不要这样做,而是将 c1, le canal est passé comme premier argument.

func main() {
    s := []string{"one", "two", "three", "four"}
    c1 := make(chan string)
    d1 := make(chan string)
    go producer(s, c1)
    go consumer(c1, d1)

    stop := time.After(2000 * time.Millisecond)
    for {
        select {
        case <-stop:
            fmt.Println("STOP AFTER 2 SEC!")
            return
        case response := <- d1:
            fmt.Println(response)
            time.Sleep(50 * time.Millisecond)
        }
    }
}
Copier après la connexion

Cela devrait montrer que le producteur écrit continuellement des nombres aléatoires sur le canal c1 et que le consommateur écrit continuellement tout le texte en majuscules sur le canal d1 jusqu'à ce que les 2 secondes soient écoulées.

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
2 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Repo: Comment relancer ses coéquipiers
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Adventure: Comment obtenir des graines géantes
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
Combien de temps faut-il pour battre Split Fiction?
3 Il y a quelques semaines By DDD

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quels sont les avantages du framework Golang ? Quels sont les avantages du framework Golang ? Jun 06, 2024 am 10:26 AM

Avantages du framework Golang Golang est un langage de programmation simultanée hautes performances particulièrement adapté aux microservices et aux systèmes distribués. Le framework Golang facilite le développement de ces applications en fournissant un ensemble de composants et d'outils prêts à l'emploi. Voici quelques-uns des principaux avantages du framework Golang : 1. Hautes performances et concurrence : Golang lui-même est connu pour ses hautes performances et sa concurrence. Il utilise des goroutines, un mécanisme de thread léger qui permet l'exécution simultanée de code, améliorant ainsi le débit et la réactivité des applications. 2. Modularité et réutilisabilité : le framework Golang encourage la modularité et le code réutilisable. En divisant l'application en modules indépendants, vous pouvez facilement maintenir et mettre à jour le code

Comment utiliser GO ou Rust pour appeler les scripts Python pour réaliser une véritable exécution parallèle? Comment utiliser GO ou Rust pour appeler les scripts Python pour réaliser une véritable exécution parallèle? Apr 01, 2025 pm 11:39 PM

Comment utiliser GO ou Rust pour appeler les scripts Python pour réaliser une véritable exécution parallèle? Récemment, j'ai utilisé Python ...

De PHP à aller ou frontal? Les suggestions et les confusions de la réalité de personnes expérimentées De PHP à aller ou frontal? Les suggestions et les confusions de la réalité de personnes expérimentées Apr 01, 2025 pm 02:12 PM

La confusion et la cause du choix de PHP à partir récemment, j'ai accidentellement appris le salaire des collègues dans d'autres postes tels que Android et intégrés C dans l'entreprise, et j'ai constaté qu'ils sont plus ...

Quelle est la stratégie de rotation des journaux de Golang sur Debian Quelle est la stratégie de rotation des journaux de Golang sur Debian Apr 02, 2025 am 08:39 AM

Dans Debian Systems, la rotation des journaux de GO repose généralement sur des bibliothèques tierces, plutôt que sur les fonctionnalités fournies avec des bibliothèques standard GO. Le bûcheron est une option couramment utilisée. Il peut être utilisé avec divers cadres journaux (tels que ZAP et Logrus) pour réaliser la rotation automatique et la compression des fichiers journaux. Voici un exemple de configuration à l'aide des bibliothèques Lumberjack et Zap: PackageMainImport ("gopkg.in/natefinch/lumberjack.v2" "go.uber.org/zap" "go.uber.org/zap/zapcor

Enregistrement des utilisateurs de la langue GO: comment améliorer l'efficacité de l'envoi des e-mails? Enregistrement des utilisateurs de la langue GO: comment améliorer l'efficacité de l'envoi des e-mails? Apr 02, 2025 am 09:06 AM

Optimisation de l'efficacité de l'envoi des e-mails dans la fonction d'enregistrement du langage GO. Dans le processus d'apprentissage du développement du backend de la langue GO, lors de la mise en œuvre de la fonction d'enregistrement des utilisateurs, il est souvent nécessaire d'envoyer une envie ...

Quel est le statut d'audience actuel du framework Go? Est-il plus adapté aux différents besoins de l'entreprise pour choisir GRPC ou GoZero? Quel est le statut d'audience actuel du framework Go? Est-il plus adapté aux différents besoins de l'entreprise pour choisir GRPC ou GoZero? Apr 02, 2025 pm 03:57 PM

Analyse de l'état d'audience du cadre GO dans l'écosystème de programmation GO actuel, les développeurs sont souvent confrontés à choisir le bon cadre pour répondre aux besoins de leurs entreprises. Aujourd'hui, nous ...

Quelle est l'ordre d'exécution de la fonction init () dans le langage go? Quelle est l'ordre d'exécution de la fonction init () dans le langage go? Apr 02, 2025 am 10:09 AM

L'ordre d'exécution de la fonction init () dans le langage Go dans la programmation Go, la fonction init () est une fonction spéciale, qui est utilisée pour exécuter certaines fonctions nécessaires lors de l'initialisation du package ...

Comment implémenter des opérations sur les listes liées Linux Iptables à Golang? Comment implémenter des opérations sur les listes liées Linux Iptables à Golang? Apr 02, 2025 am 10:18 AM

Utilisation de Golang pour implémenter Linux ...

See all articles