首页 > 解决方案 > goroutine 在传递数据时挂起

问题描述

给定以下变量

wg.Add(4)
pDayResCh := make(chan map[string]map[string]int)
pDayErrCh := make(chan error)

以下代码挂起

    // Convert the previous, current, and next day prayers and put them in map
    go func() {
        fmt.Println("executing first go routine") // TODO: Remove this line after debug
        data, err := dayPrayerMapConv(previousDayPrayers)
        fmt.Printf("first goroutine result %v\n", data) // TODO: Remove this line after debug
        if err != nil {
            fmt.Printf("first goroutine err != nil %v\n", err)
            pDayErrCh <- err
        }
        fmt.Printf("first goroutine putting data into channel")
        pDayResCh <- data
        fmt.Printf("first go routine finished") // TODO: Remove this line after debug
        wg.Done()
    }()

    pDayErr := <-pDayErrCh
    close(pDayErrCh)
    if pDayErr != nil {
        return pDayErr
    }

    fmt.Println("pday err finised")
    p.PreviousDayPrayers = <-pDayResCh
    close(pDayResCh)

这是打印语句的结果

first goroutine result map[Asr:map[Hour:3 Minute:28] Dhuhr:map[Hour:12 Minute:23] Fajr:map[Hour:5 Minute:32] Isha:map[Hour:7 Minute:5] Maghrib:map[Hour:6 Minute:13]]
first goroutine putting data into channel

所以data变量中有数据本来应该传入pDayResCh,但是好像卡在那里,为什么?

标签: goconcurrency

解决方案


由于我检查错误的 goroutine 中的情况

if err != nil {
            fmt.Printf("first goroutine err != nil %v\n", err)
            pDayErrCh <- err
        }

因为错误为零,所以数据永远不会传递到通道中,因此挂起

删除条件并传递错误无论如何都可以解决问题。


推荐阅读