Maison > développement back-end > Golang > le corps du texte

Pourquoi mon « Canal d'attente d'attente » personnalisé ne fonctionne-t-il pas et comment puis-je le faire fonctionner ?

WBOY
Libérer: 2024-02-12 23:06:09
avant
1052 Les gens l'ont consulté

Pourquoi mon « Canal dattente dattente » personnalisé ne fonctionne-t-il pas et comment puis-je le faire fonctionner ?

Lorsque l'éditeur php Xiaoxin utilise le "canal d'attente d'expiration" personnalisé, vous pouvez rencontrer une situation où il ne fonctionne pas. Cela peut être dû à certains problèmes courants, tels qu'une configuration incorrecte ou des problèmes de codage. Afin de faire fonctionner le « délai d'attente d'attente du canal » personnalisé, nous pouvons adopter certaines solutions de contournement. Tout d’abord, nous devons nous assurer que le canal et le délai d’attente sont correctement configurés. Deuxièmement, nous pouvons vérifier s'il y a des bugs ou des problèmes de logique dans le code qui pourraient entraîner le délai d'attente pour que le canal ne fonctionne pas. Enfin, nous pouvons également envisager d'utiliser d'autres technologies ou outils connexes pour traiter les problèmes d'attente d'expiration, comme l'utilisation de bibliothèques d'empaquetage ou l'utilisation de minuteries pour surveiller et gérer les situations d'expiration. Grâce à ces méthodes, nous pouvons faire fonctionner correctement le « canal d'attente d'expiration » personnalisé et améliorer les performances et la stabilité de notre application.

Contenu de la question

J'essaie de créer mon propre "délai d'expiration de chaîne" personnalisé. Plus précisément, la fonction time.after qu'il contient. En d'autres termes, j'essaie de mettre en œuvre ceci :

select {
case v := <-c:
    fmt.println("value v: ", v)
case <-time.after(1 * time.second):
    fmt.println("timeout")
}
Copier après la connexion

Mais malheureusement, j'ai rencontré un problème.

Ma mise en œuvre est :

func waitFun(wait int) chan int {
    time.Sleep(time.Duration(wait) * time.Second)

    c := make(chan int)
    c <- wait

    return c
}

func main() {
    c := make(chan int)
    go func() {
        time.Sleep(3 * time.Second)
        c <- 10
    }()

    select {
    case v := <-c:
        fmt.Println("Value v: ", v)
    case <-waitFun(1):
        fmt.Println("Timeout")
    }

    time.Sleep(4 * time.Second)
}
Copier après la connexion

Pour une raison quelconque, cela ne fonctionne pas. L'erreur est : tous les goroutines sont en veille - impasse ! . Je sais qu'à un moment donné, toutes les goroutines (principales et celles introduites avec des fonctions anonymes) se mettent en veille, mais est-ce la raison du bug ou autre chose ? Je veux dire, ce n'est pas "un sommeil infini" ou "une attente infinie de quelque chose", donc ce n'est pas une impasse, n'est-ce pas ? De plus, utiliser all goroutine 正在休眠 - 死锁!。我知道在某个时刻,所有 goroutine(main 和用匿名函数引入的 goroutine)都会进入睡眠状态,但这是错误的原因还是其他原因?我的意思是,这不是“无限睡眠”或“无限等待某事”,所以这不是死锁,对吧?另外,使用 time.after 也会让 goroutine 休眠,对吗?我需要更改什么才能使我的程序正常工作?

解决方法

select 语句将在运行时评估所有情况,因此此代码实际上会等待 waitfun 返回,然后才开始侦听任何通道。您必须更改 waitfun fera également dormir la goroutine, n'est-ce pas ? Que dois-je changer pour que mon programme fonctionne ?

🎜Solution de contournement🎜🎜 L'instruction select évaluera tous les cas au moment de l'exécution, donc ce code attendra en fait le retour de waitfun avant de commencer à écouter des chaînes. Vous devez changer waitfun pour renvoyer la chaîne immédiatement : 🎜
func waitFun(wait int) chan int {
    c := make(chan int)
    go func() {
       time.Sleep(time.Duration(wait) * time.Second)
       c <- wait
    }()
    return c
}
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!