如何使用API​​

时间:2018-08-10 12:07:28

标签: python google-cloud-storage

我正在使用Google Cloud Storage package for Python将一堆文件从一个存储桶复制到另一个存储桶。基本代码是:

from google.cloud.storage.client import Client
def copy_bucket_content (client:Client, source_bucket_name, destination_bucket_name, source_dir):
    source_bucket = client.get_bucket(source_bucket_name)
    destination_bucket = client.get_bucket(destination_bucket_name)
    blobs_to_copy = [blob for blob in source_bucket.list_blobs() if blob.name.startswith(source_dir)]
    source_bucket.
    for blob in blobs_to_copy:
        print ("copying {blob}".format(blob=blob.name))
        source_bucket.copy_blob(blob, destination_bucket, blob.name)

当我传递其中包含许多blob的source_dir时,脚本将在运行时失败,并显示以下内容:

  

第293行,位于api_request中的“ /Users/jamiet/.virtualenvs/hive-data-copy-biEl4iRK/lib/python3.6/site-packages/google/cloud/_http.py”文件
      引发异常。from_http_response(response)
  google.api_core.exceptions.InternalServerError:500 POST https://www.googleapis.com/storage/v1/b/path/to/blob/copyTo/b/path/to/blob:后端错误

这总是发生在传输50到80个Blob之后(每次都不会在同一点失败)。

我假设我正在达到某种API请求限制。是这样吗?

如果是这样,我该如何解决?我想解除限制是一种方法,但更好的方法是只发出一个对REST API的调用,而不是遍历所有blob并一次复制一个。我搜索了GCS python软件包,但没有找到任何可能有用的东西。

我认为有一种更好的方法可以完成此任务,但是我不知道这是什么,有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

关于这种情况,没有quota restriction。错误500指示服务器端问题。根据{{​​3}}文档,您可以使用exponential backoff策略,并遵循Handling errors的最佳做法。