我正在开发此 CLI以将图像上传到 Google 照片。CLI 创建多个 go 例程来并行上传文件1。上传后,相同的例程会将其添加到Album. 如果这些相册在2之前不存在,则创建这些相册。由于并发性和Google Photos API 允许创建两个Albums具有相同名称的事实,我想要避免重复的专辑名称。GetOrCreateAlbumByName() 3并不能确保Album是唯一的。它基本上询问是否存在同名的专辑,如果不存在,它将创建一个新专辑。但是可以并行调用此函数,因此Album可以创建两个具有相同名称的函数。除了实现互斥锁之外,我还在观察重复项。你会建议如何处理?创建一个处理专辑创建的 Worker(如微服务)。在创建相册之前,每个 goroutine 都将被阻止。它将删除Album创建部分的并发性。维护一个相册缓存并使用它来检查相册是否已经创建。在这种情况下,竞争条件也可能发生,但概率较小。1 和 2 一起使用。其他,请注明。我对 1、2 和 3 感到担忧……这就是为什么我想知道您将如何处理。提前致谢
1 回答

UYOU
TA贡献1878条经验 获得超4个赞
您用于Client.GetOrCreateAlbumByName()获取或创建相册。此方法对于并发使用是安全的,它在内部使用互斥锁来序列化调用,从而确保不会创建重复项。
但是,您在这里创建和使用多个客户端,这意味着对所有客户端的并发调用不会被序列化,只会对单个客户端的并发调用。
所以解决方案要么使用单个客户端,然后所有调用都将被序列化,或者如果这不可能,您必须序列化对所有客户端的调用,例如使用单个互斥锁或其他方式。
如何使用互斥锁序列化对所有客户端的调用的示例:
var mu sync.Mutex
func GetOrCreateAlbumByName(c *gphotos.Client, name string) (*photoslibrary.Album, error) {
mu.Lock()
defer mu.Unlock()
return c.GetOrCreateAlbumByName(name)
}
无论您在哪里使用client.GetOrCreateAlbumByName(name),都将其替换为调用:
GetOrCreateAlbumByName(client, name)
- 1 回答
- 0 关注
- 136 浏览
添加回答
举报
0/150
提交
取消