Maison  >  Article  >  développement back-end  >  Y a-t-il une impasse lors de l'utilisation de deux fmt.println dans une routine go ?

Y a-t-il une impasse lors de l'utilisation de deux fmt.println dans une routine go ?

WBOY
WBOYavant
2024-02-09 10:15:31814parcourir

在 go 例程中使用两个 fmt.println 时会出现死锁吗?

En langage Go, l'utilisation de deux fonctions d'impression fmt.Println() provoquera-t-elle une impasse ? C’est une question courante, répondons-y. Premièrement, nous devons comprendre le concept d’impasse. Un blocage est une situation dans laquelle deux processus ou plus s'attendent l'un l'autre pour se terminer, empêchant le programme de continuer à s'exécuter. Dans le langage Go, si vous utilisez la fonction d'impression fmt.Println() dans deux routines en même temps, puisque la sortie standard est thread-safe, aucun blocage ne se produira. Par conséquent, vous pouvez utiliser en toute sécurité plusieurs fonctions fmt.Println() dans votre routine go sans vous soucier des problèmes de blocage.

Contenu des questions

J'essaie d'apprendre le go et j'expérimente sur la cour de récréation. J'ai un code très simple. J'essaie d'utiliser des structures et des tranches ensemble dans une routine go. Je ne sais pas si ce serait quelque chose que j'utiliserais en production, mais cela semble un peu bizarre, alors voilà :

func main() {
    routinemsg := make(chan []Person)
    routinemsg2 := make(chan []Person)

    // create the person records
    p1 := newPerson("john doe", 25)
    p2 := newPerson("dohn joe", 52)
    p3 := newPerson("bohn joo", 30)

    // send a slice of Person to the first routine
    go func() { routinemsg <- []Person{p1, p2} }()

    // retrieve the slice from the first routine[in the append]
    // append p3 to the slice retrieved from the first routine
    // send the new slice to the second routine
    go func() { routinemsg2 <- append(<-routinemsg, p3) }()
    
    // I am able to see the first Println but when I insert the second one I get a deadlock error
    // also, same error if I use one Println with 2 arguments.
    fmt.Println(<-routinemsg)
    fmt.Println(<-routinemsg2)
}

J’ai entendu parler de groupes d’attente mais je ne les connais pas encore ! Alors, soyez gentil avec moi :d, merci d'avoir pris le temps

Workaround

routinemsg 上只有一个发送操作,但您有 2 个接收操作:一个在启动的 goroutine 中,另一个在 main dans goroutine. La valeur envoyée ne peut être reçue qu'une seule fois par un destinataire.

Si la goroutine démarrée reçoit de routinemsg接收,那么就会出现死锁:main en premier, elle sera bloquée pour toujours.

Si main goroutine 首先接收,那么启动的 goroutine 将永远阻塞(尝试从中接收),因此它永远无法在 routinemsg2 上发送任何内容,因此 main 中从 routinemsg2 la réception bloque également pour toujours : à nouveau une impasse.

Supprimer main() 中的 fmt.println(<-routinemsg) 行,然后从 routinemsg2 的最终接收可以(最终)继续并打印包含 p1p2 和 phpcnc 的切片phpcnp3 :

[{john doe 25} {dohn joe 52} {bohn joo 30}]

Essayez-le sur le go terrain de jeu.

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer