Kod berikut melaksanakan penggunaan dua gorout untuk mencetak elemen secara bergilir-gilir dalam senarai terpaut. Walau bagaimanapun, ia mengalami masalah yang agak pelik di mana hasil cetakan tidak dapat dilihat tanpa masa akhir. tidur. Secara teorinya, stdout tidak mempunyai penimbal. Bolehkah sesiapa memberi panduan?
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) }
Anda mesti memanggil wg.Add(1)
pada Goroutine utama kerana kaunter kumpulan tunggu ditambah sebelum 2 Goroutine yang bermula tiba sebelum main()
wg.Wait()
ialah senario yang sah. Jika kaunternya ialah 0, wg.Wait()
tidak menyekat, main()
kembali, dan oleh itu keseluruhan aplikasi ditamatkan: 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
wg.Add(1)
dalam Lihat: Tempat untuk meletakkan wg.Add()
Atas ialah kandungan terperinci Mengapa saya tidak dapat melihat output jika saya tidak tidur pada penghujungnya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!