다음 코드는 연결된 목록의 요소를 교대로 인쇄하기 위해 두 개의 고루틴을 사용하는 방법을 구현합니다. 그러나 최종 시간이 없으면 인쇄된 결과가 보이지 않는 다소 이상한 문제가 발생합니다. 잠. 이론적으로 stdout에는 버퍼가 없습니다. 누구든지 지침을 제공할 수 있습니까?
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) }
기본 고루틴에서 wg.Add(1)
를 호출해야 합니다. 대기 그룹 카운터는 main()
전에 시작된 2개의 고루틴이 도착하기 전에 증가하기 때문입니다. wg.Wait()
는 유효한 시나리오입니다. 카운터가 0이면 wg.Wait()
가 차단되지 않고 main()
이 반환되므로 전체 애플리케이션이 종료됩니다. 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)
를 제거하세요. wg.Add()를 배치할 위치
위 내용은 마지막에 잠을 자지 않으면 왜 출력을 볼 수 없나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!