Heim  >  Artikel  >  Backend-Entwicklung  >  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
WBOYnach vorne
2024-02-06 11:21:03684Durchsuche

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)
}

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)

(当然,从工作人员中删除 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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen