![](/img/trans.png)
[英]Twitter Rate limit exceeded. Clients may not make more than 350 requests per hour
[英]User rate limit exceeded after a few requests
我通過pydrive使用Google Drive API在兩個谷歌驅動器帳戶之間移動文件。 我一直在測試一個包含16個文件的文件夾。 我的代碼總是在第六個文件中引發錯誤
“超出用戶速率限制”>
我知道請求數量有限制(10 / s或1000 / 100s),但我已嘗試使用Google Drive API建議的指數退避來處理此錯誤。 即使在248秒之后,它仍然會引發同樣的錯誤。
這是我正在做的一個例子
def MoveToFolder(self,files,folder_id,drive):
total_files = len(files)
for cont in range(total_files):
success = False
n=0
while not success:
try:
drive.auth.service.files().copy(fileId=files[cont]['id'],
body={"parents": [{"kind": "drive#fileLink", "id": folder_id}]}).execute()
time.sleep(random.randint(0,1000)/1000)
success = True
except:
wait = (2**n) + (random.randint(0,1000)/1000)
time.sleep(wait)
success = False
n += 1
我嘗試使用“批處理請求”來復制文件,但它會為10個文件引發相同的錯誤。
def MoveToFolderBatch(self,files,folder_id,drive):
cont=0
batch = drive.auth.service.new_batch_http_request()
for file in files:
cont+=1
batch.add(drive.auth.service.files().copy(fileId=file['id'],
body={"parents": [
{"kind": "drive#fileLink", "id": folder_id}]}))
batch.execute()
有人有任何提示嗎?
編輯:根據谷歌支持:
關於超出用戶速率限制錯誤,與控制台中設置的每用戶速率限制完全無關。 相反,它來自Drive API依賴的內部Google系統,並且最有可能在單個帳戶擁有域中的所有文件時發生。 我們不建議單個帳戶擁有所有文件,而是讓域中的個人用戶擁有這些文件。 要傳輸文件,您可以查看此鏈接。 另外,請檢查建議上的此鏈接以避免錯誤。
403:超出用戶速率限制基本上是防洪。
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "userRateLimitExceeded",
"message": "User Rate Limit Exceeded"
}
],
"code": 403,
"message": "User Rate Limit Exceeded"
}
}
你需要放慢速度。 正如您所做的那樣實施指數退避是正確的行動方案。
谷歌在計算請求時並不完美,因此自己計算這些請求實際上並沒有幫助。 有時你可以在第二次獲得15次請求時,你只能獲得7次。
您還應該記住,如果服務器上有很多負載,您正在與使用服務器的其他人完成您的一個請求可能需要更長時間,而另一個可能不會。 不要在大多數人設置提取的cron作業的時候運行。
注意:如果您轉到google開發者控制台,您已啟用驅動器API到達配額選項卡,請單擊旁邊的鉛筆圖標
每個用戶每100秒查詢一次
和
查詢每100秒
你可以增加它們。 一個是基於用戶,另一個是基於項目。 每個用戶可以在100秒內發出X請求,您的項目可以每100秒發出Y請求。
注意:不知道你可以設置多高。 這是我的開發帳戶,所以它可能有一些我無法記住的測試版訪問權限。
每秒僅插入一次后,請參閱403速率限制,插入時的 403速率限制有時會成功
關鍵點是: -
退避但不實施指數退避! 。 這將簡化您的應用程序吞吐量
相反,你需要主動限制你的請求,以避免304的發生。 在我的測試中,我發現最大可持續吞吐量是每1.5秒約1次交易。
批處理會使問題變得更糟,因為批次在304被提升之前被解包。 IE瀏覽器。 一批10個被解釋為10個快速交易,而不是1個。
試試這個算法
delay=0 // start with no backoff
while (haveFilesInUploadQueue) {
sleep(delay) // backoff
upload(file) // try the upload
if (403 Rate Limit) { // if rejected with a rate limit
delay += 2s // add 2s to delay to guarantee the next attempt will be OK
} else {
removeFileFromQueue(file) // if not rejected, mark file as done
if (delay > 0) { // if we are currently backing off
delay -= 0.2s // reduce the backoff delay
}
}
}
// You can play with the 2s and 0.2s to optimise throughput. The key is to do all you can to avoid the 403's
有一點需要注意的是,驅動器中存在(是?)錯誤,有時上傳會被403拒絕,但是,盡管發送了403,但驅動器繼續創建文件。 症狀將是重復的文件。 所以為了更加安全,在403之后你應該以某種方式檢查文件是否真的存在。 最簡單的方法是使用預先分配的ID,或者將自己的不透明ID添加到屬性中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.