go - 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,但是好像卡在那里,为什么?
解决方案
由于我检查错误的 goroutine 中的情况
if err != nil {
fmt.Printf("first goroutine err != nil %v\n", err)
pDayErrCh <- err
}
因为错误为零,所以数据永远不会传递到通道中,因此挂起
删除条件并传递错误无论如何都可以解决问题。
推荐阅读
- kotlin - Kotlin 挂起修饰符更改函数签名,但编译器报告重载错误
- r - 使用 data.table 的函数无法输出到控制台,但可以很好地分配给对象 - 怎么会?
- mysql - 从一列计算Mysql 5.5中的值并按另一列分组
- spring - Spring Boot gradle 构建和推送 docker 镜像
- excel - 什么是 GDA,我如何确定它是否已应用于工作站?
- elixir - 使用 Gigalixir 部署时的问题
- c# - TaskContinuationOptions 组合
- laravel - 使用 Route::delete 时出现 MethodNotAllowedHttpException
- java - 如何在 Spring Application 中配置 DEV 部分?
- python-3.x - Python import pygame 不播放音频