【问题标题】:Google Drive Upload Race ConditionGoogle 云端硬盘上传竞争条件
【发布时间】:2014-09-17 11:10:55
【问题描述】:

我正在尝试将我的应用程序与 Google 云端硬盘同步。现在,当我们将文件上传到云端硬盘时,我们会将文件 ID 和元数据保存在本地(到 Redis)。然后下次我们从云端硬盘收到推送通知时,我们会比较该文件是否与我们本地的版本不同,或者我们是否需要更新、删除或创建文件。

我正在加载这样的文件

media_body = MediaFileUpload(local_path,
                             mimetype='binary/octet-stream',
                             chunksize=50000000,
                             resumable=True)
body = {'title': file_name, 'parents': [{'id': parent_id}]}
request = client.files().insert(
    body=body,
    media_body=media_body)
response = None
while response is None:
    status, response = request.next_chunk()
    if status:
         print "Uploaded %d%%." % int(status.progress() * 100)
results.append(response)

然后results 会立即保存到 Redis(文件 ID、元数据...)。

问题是我们偶尔会收到推送通知,检测到文件已添加到云端硬盘,但我们尚未将该 ID 保存到 Redis。因此它注册为一个新文件,这意味着我们现在下载它并拥有该文件的两个版本。

我认为这一定是因为 Google Drive 在上传 API 调用返回之前发送了更改的推送通知。我无法在上传之前将 ID 添加到 Redis,因为直到上传函数返回我们才知道它......有人可以提出一个可能的解决方案吗?

【问题讨论】:

    标签: python google-drive-api


    【解决方案1】:

    问题是由您在单个命令中创建文件并上传媒体内容这一事实引起的(或至少使问题变得更糟)。如果您将文件与媒体分离(即插入没有内容的文件,然后使用内容更新它),您应该没问题。请记住,如果您这样做,您将收到 2 条通知,一条用于插入,另一条用于更新内容。

    或者,有这样的逻辑......

    havePendingInsert = true
    request = client.files().insert(...  // your line 6
    havePendingInsert = false
    processAnyCachedPushNotifications()
    
    and in your module which deals with push notifications...
    if (havePendingInsert) {
        storeNotificationInCache()
    } else {
        processNotificationNow()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多