我使用谷歌pubsub发布了大量的记录,这是同时发生的,但经过几十次发布,我得到一个错误:并发Map写入。
我已经读到我应该使用sync.Map{}或sync.Mutex,但我还没有找到一个例子来帮助我理解如何在我的特定情况下使用它。
下面是一个代码片段,它给我带来了问题:
md := metadata.Collect(ctx)
records, err := s.emailRepository.SetCurrentVersionWithEnsure(ctx, md.GetTransactionId(), valid)
if err != nil {
return err
}
for _, value := range records {
go s.pub.PublishAction(md, value)
}
return nil
字符串
变量记录的类型为map[string][]byte
如果有人能在这方面提供帮助,我将不胜感激。干杯!
2条答案
按热度按时间cedebl8k1#
多个goroutine试图并发或同时读写你的map。是的,
sync.Mutex
是可以修复该错误的解决方案之一,因为它确保只有一个goroutine可以访问map。除了sync.Mutex之外,还可以使用sync.RWMutex
。要并发访问Map,可以使用sync.Map
。您可以参考此SO case。将此答案作为社区Wiki发布,因为这是可能的已知解决方案,并且为了将来可能遇到此用例的社区的利益。
请随时编辑此答案以了解更多信息,以及此用例是否有其他可能的变通方法/直接解决方案。
bwitn5fc2#
我发现了一个关于我的特殊案例的问题。
在方法PublishAction中,有一行代码用于检查pubsub主题是否存在。这一行通过ping google服务器来实现,但是你在一分钟内可以访问该服务器的次数是有限制的。