我一直在使用Google Vision API在某些使用Python的文档中执行OCR任务。
它开始完美运行,直到我开始接收Http错误代码429,这意味着我在很短的时间内做了太多的请求。然后,我决定在每个请求之间进行休眠,随着Http错误代码429的数量增加,该时间会增加。但是,一段时间后,错误消息不断出现。由于消息一直到达,因此睡眠时间不断增加,直到它达到睡眠时间太久以至于失去连接的程度。
最奇怪的是,如果我连续多次收到此类错误消息,并立即完成该过程并再次启动,请求会在第一次尝试时再次开始工作。
换句话说,似乎无论我把睡眠时间放在哪里,我都会在某个时刻开始接收这样的消息,并且让它再次起作用的唯一方法就是重新开始这个过程(这根本就没有任何意义)。
如何在不重启过程的情况下避免出现此类错误消息?任何人都可以帮助我吗?
非常感谢!
编辑:
这是请求的代码(部分内容)。
from apiclient import discovery
from oauth2client.client import GoogleCredentials
# The other imports are omitted
DISCOVERY_URL = 'https://{api}.googleapis.com/$discovery/rest?version={apiVersion}' # noqa
credentials = GoogleCredentials.get_application_default()
self.vision = discovery.build(
'vision', 'v1', credentials=credentials,
discoveryServiceUrl=DISCOVERY_URL)
batch_request = []
for image in images:
batch_request.append({
'image': {
'content': base64.b64encode(image).decode('UTF-8')
},
'features': [{
'type': 'TEXT_DETECTION',
}]
})
request = self.vision.images().annotate(
body={'requests': batch_request})
答案 0 :(得分:0)
您已使用过应用程序默认凭据
credentials = GoogleCredentials.get_application_default()
也许它无法找到凭据并用于请求,因此向API发出匿名请求,即在您的情况下不允许超过2或3个请求,我也遇到了同样的问题并找到了工作围绕着:
(注意:如果您尚未设置API密钥或服务帐户密钥,请参阅此doc以创建一个。)
用于开发:使用API密钥
你可以像以下一样使用它:
self.vision = discovery.build(
'vision', 'v1', credentials=credentials,
discoveryServiceUrl=DISCOVERY_URL, developerKey='your_api_key'
)
用于生产:使用服务帐户密钥
from oauth2client.service_account import ServiceAccountCredentials
scopes = ['https://www.googleapis.com/auth/sqlservice.admin']
credentials = ServiceAccountCredentials.from_json_keyfile_name(
'/path/to/keyfile.json', scopes=scopes)
您可以找到要使用的范围列表here。
此外,您需要设置此环境变量:
GOOGLE_APPLICATION_CREDENTIALS="/path/to/secret-key-file"
您不需要为每个请求增加睡眠时间,只需在使用上述任何方法时请求失败时增加睡眠时间。在docs中寻找指数退避算法。