为了账号安全,请及时绑定邮箱和手机立即绑定

针对 Google Photos API 的竞争条件

针对 Google Photos API 的竞争条件

Go
眼眸繁星 2022-06-21 16:30:18
我正在开发此 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)


查看完整回答
反对 回复 2022-06-21
  • 1 回答
  • 0 关注
  • 136 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号