【发布时间】:2016-10-11 16:52:14
【问题描述】:
我一直在使用 Google Vision API 在一些使用 Python 的文档中执行 OCR 任务。
它开始正常工作,直到我开始收到 Http 错误代码 429,这意味着我在短时间内执行了太多请求。然后,我决定在每个请求之间放置一个睡眠,随着 Http Error Code 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})
【问题讨论】:
-
是否有
Retry-After标头返回,所以您知道何时发出下一个请求? -
@jonrsharpe 感谢您的及时回答。我试图获取标头信息,但似乎该请求完全是在我正在使用的 API 的方法中发出的。因此,当出现错误时,我无权访问任何响应和标头。 API 只是抛出一个异常(在本例中为 HttpError)。不幸的是,我在异常消息中找不到任何可以提供帮助的内容。这是调用:request = self.vision.images().annotate(body={'requests': batch_request})
-
您使用的是什么库?有时,如果您捕获并检查错误,它会有更多可用信息:例如,
urllib2的HttpError包含info、message、reason等。 -
我用一些代码编辑了帖子。 @ap 我正在使用适用于 Python 的 Google 客户端 API。无论如何,我会更深入地研究异常消息,看看我是否发现了一些有用的东西。谢谢!
-
我刚刚检查了异常属性,并没有找到Retry-After字段。这是异常消息中的消息: "error": {\n "code": 429,\n "message": "Insufficient tokens for quota group and limit \'DefaultGroupUSER-100s\' of service \'vision.googleapis .com\',使用 ID 限制 (...)"}
标签: python ocr http-error google-cloud-vision http-status-code-429