我是 Go 和 Go 并发的新手。一旦找到具有给定 ID 的成员,我正在尝试使用 Go 上下文来取消一组 Go 例程。
一个组存储一个客户列表,每个客户都有一个成员列表。我想并行搜索所有客户及其所有成员,以找到具有给定 ID 的成员。一旦找到此成员,我想取消所有其他 Go 例程并返回发现的成员。
我尝试了以下实现,使用 context.WithCancel 和 WaitGroup。
然而,这不起作用,并且无限期地挂起,永远不会越过waitGroup.Wait(),但我不确定为什么。
func (group *Group) MemberWithID(ID string) (*models.Member, error) {
found := make(chan *models.Member)
ctx := context.Background()
ctx, cancel := context.WithCancel(ctx)
defer cancel()
var waitGroup sync.WaitGroup
for _, client := range group.Clients {
waitGroup.Add(1)
go func(clientToQuery Client) {
defer waitGroup.Done()
select {
case <-ctx.Done():
return
default:
}
member, _ := client.ClientMemberWithID(ID)
if member != nil {
found <- member
cancel()
return
}
} (client)
}
waitGroup.Wait()
if len(found) > 0 {
return <-found, nil
}
return nil, fmt.Errorf("no member found with given id")
}