我了解资源限制,您可以等一下再去一次。 因此,我编写了一个代码,一直运行到达到限制为止,然后等待6分钟,然后再次运行,等等。只是为了测试时间限制。
有时候6分钟就足够了,有时候还不够。我需要一种一致的方法来克服此资源限制。
counter=0
try:
for i in range(5000): # high enough to break limit
client.open(google_sheet).sheet1
counter+=1
sleep(.02)
print counter
except Exception as e:
print "ERROR"
if re.search('"code": 429', str(e)): #confirms error is due to resource limit
sleep(360)
for i in range(5000):
sheets_of_months[1].sheet_object
counter+=1
sleep(.02)
print counter
我让它运行直到错误出现,等待6分钟,然后再次运行。印刷只是为了避免任何毫无意义的等待。
感谢您的阅读,并感谢您的任何答复!
答案 0 :(得分:0)
Google建议的管理配额限制的方法是使用exponential backoff logic实施请求。我建议您(通过Google)阅读此文档:
如果您愿意,可以找到不同的库来帮助您实现指数补偿:
使用坚韧的代码查看代码,您可以做的是:
import tenacity
# Wait 2^x * 0.5 seconds between each retry, up to 60 seconds
# 60 seconds afterwards.
# Stops after 30 attempts
@tenacity.retry(stop=tenacity.stop_after_attempt(30),
wait=tenacity.wait_exponential(multiplier=0.5, max=60))
def call_with_exponential_backoof(client, google_sheet):
client.open(google_sheet).sheet1
答案 1 :(得分:0)
好吧,所以我看了看,只是花了几个小时来运行不同的代码,所以我想通了。因此,this post在我也注意到Google的帖子不一致时确实为我提供了帮助。但是答案指出了我需要考虑的问题。
“关于算法的重要部分是它的指数性,而不是尝试次数。”
Google文档说要在16秒钟后停止并记录下来。
所以我尝试了一些答案,
在开始重新加载页面之前,我从增加睡眠时间开始。甚至长达20分钟的时间都值不值,有时仍然无法使用。但是有时候30秒就足够了。
我尝试在睡眠量上增加随机的秒数,以保持睡眠时间的差异和随机性,如文档中所建议的那样,但是我认为这更多的是用于网络,而不是一个程序和一个工作表进行通信,而没有其他机器会产生干扰。
我尝试更改页面,也许我打开的页面被锁定,因为我遇到了资源限制。
我基本上做了一个小的while循环,一次又一次地循环,当它起作用时,它打印出资源限制冷却所花的时间。我有时用这些变量中的每一个进行测试,得出以下结论。
您要打开的页面永远不会锁定,无需切换页面,尽管它似乎对我有用,但那只是运气。进一步的研究证明它没有用。
有时,它只是说您仍然处于极限,这是否是由于它以某种方式尝试在睡眠期间打开文件进行准备,idk。我所知道的是20分钟的睡眠时间,这仍然会说我已处于极限。
随机整数虽然可能对于防止请求捆绑的网络问题很有用,但对我而言并不是一个问题。因此,多余的代码意味着摆脱它。
此循环我平均约30秒,有时是一分钟。但是工作。感谢所有阅读并关心阅读这篇文章的人。我希望我能很好地解释我的思想过程,并为社区提供一些帮助。
times_page_opened=0
amount_of_seconds_iterating= 2
while True:
counter=0
try:
for i in range(5000):
counter+=1
if counter==2: # This confirms that it has opened a page again at least once already, meaning the limit has reset.
print "Had to wait %s seconds" % (amount_of_seconds_iterating) # This prints the amount of seconds in the iteration that it took.
amount_of_seconds_iterating= 2 # This just resets the iteration to 2 seconds for next time.
client.open(google_sheet).sheet1 # This just opens the actual page.
times_page_opened+=1
sleep(.02)
print times_page_opened # This helps me keep track of how many times the code has succesfully opened the page.
except Exception as e:
print "ERROR" # Tells me the code is waiting because it hit the error.
amount_of_seconds_iterating*=2 # Doubles the waiting time.
try:
if re.search('"code": 429', str(e)): # Confirms that it is infact the resource limit error.
sleep(amount_of_seconds_iterating)
client.open(google_sheet).sheet1 # Attempts again to re-open the page.
except:
print "Double Error"
实施并简化后,它看起来像这样。
def reset_limit():
iteration= 2
while True:
try:
client.open('Chem Sheet Summary Report DO NOT DELETE').sheet1
return
except:
iteration*=2
sleep(iteration)
要使用它,我将尝试执行将要执行的任何操作,如果遇到资源限制,它将调用reset_limit函数,该函数仅在资源限制重置后才返回,就像这样。
while True:
try:
client.open(google_sheet).sheet1
except Exception as e:
if re.search('"code": 429', str(e)):
reset_limit()