[错误] compose: receiveWithDeadline 从一个 goroutine 中写入命名结果,与截止时间返回同时发生
作者: newnewself创建于 2026年9月12日更新于 2026年9月12日
描述错误
compose.receiveWithDeadline 创建一个 goroutine,将直接分配给包含函数的 命名返回值:
go func() {
ta, closed = recv() // 将调用者可见的结果写入
resultCh <- struct{}{} // 将结果写入通道
}()当超时时间在 recv() 返回之前触发时,函数通过超时分支返回(返回 nil、false、true),而被放弃的 goroutine 仍在运行。如果待处理接收操作完成,则 goroutine 会同时写入 ta/closed,并且调用者读取结果也与之无序。没有任何东西同步这两者:在超时分支中,goroutine 的写入和函数的返回没有发生先于关系,因此在每次超时到期时,待处理任务在超时时间之后完成。
内容来源: cloudwego/eino