Heim > Backend-Entwicklung > Golang > Warum kann ich die Ausgabe nicht sehen, wenn ich am Ende nicht schlafe?

Warum kann ich die Ausgabe nicht sehen, wenn ich am Ende nicht schlafe?

WBOY
Freigeben: 2024-02-06 11:22:09
nach vorne
767 Leute haben es durchsucht

Warum kann ich die Ausgabe nicht sehen, wenn ich am Ende nicht schlafe?

Frageninhalt

Der folgende Code implementiert die Verwendung von zwei Goroutinen, um Elemente in der verknüpften Liste abwechselnd zu drucken. Es besteht jedoch ein ziemlich seltsames Problem, bei dem das gedruckte Ergebnis ohne die Endzeit nicht sichtbar ist. schlafen. Theoretisch hat stdout keinen Puffer. Kann mir jemand eine Anleitung geben?

import (
    "context"
    "fmt"
    "sync"
)

type ListNode struct {
    val  int
    next *ListNode
}

func NewLinkedList() (head *ListNode) {
    var cur *ListNode
    for i := 0; i < 100; i++ {
        if cur == nil {
            cur = &ListNode{val: i}
            head = cur
        } else {
            cur.next = &ListNode{val: i}
            cur = cur.next
        }
    }
    return
}

func main() {
    ll := NewLinkedList()
    wg := sync.WaitGroup{}
    var a = make(chan *ListNode, 1)
    var b = make(chan *ListNode, 1)
    ctx, cancel := context.WithCancel(context.Background())
    worker := func(name string, input, output chan *ListNode) {
        wg.Add(1)
        defer wg.Done()
        for {
            select {
            case n := <-input:
                if n == nil {
                    break
                }
                fmt.Printf("%s: %d\n", name, n.val)
                if n.next != nil {
                    output <- n.next
                } else {
                    cancel()
                    break
                }
            case <-ctx.Done():
                break
            }
        }
    }

    go worker("a", a, b)
    go worker("b", b, a)

    a <- ll
    wg.Wait()
    //time.Sleep(time.Millisecond)
}
Nach dem Login kopieren

Richtige Antwort

Sie müssen wg.Add(1) auf der Haupt-Goroutine aufrufen, da der Waitgroup-Zähler erhöht wird, bevor die beiden gestarteten Goroutinen vor main() eintreffen wg.Wait() ist ein gültiges Szenario. Wenn sein Zähler 0 ist, blockiert wg.Wait() nicht, main() gibt zurück, und so wird die gesamte Anwendung beendet: wg.Add(1),因为在 2 个启动的 Goroutine 增加 waitgroup 计数器之前 main() 到达 wg.Wait() 是一个有效的场景。如果其计数器为 0,则 wg.Wait() 不会阻塞,main() 返回,因此整个应用程序终止:

wg.Add(1)
go worker("a", a, b)
wg.Add(1)
go worker("a", a, b)
Nach dem Login kopieren

(当然,从工作人员中删除 wg.Add(1)rrreee

(vom Worker, von natürlich Entfernen Sie wg.Add(1) in

Siehe: Wo soll wg.Add() platziert werden

Das obige ist der detaillierte Inhalt vonWarum kann ich die Ausgabe nicht sehen, wenn ich am Ende nicht schlafe?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage