«Ошибка HTTP: 429 Ошибка клиента: слишком много запросов для URL» в Python [с учетной записью разработчика Azure] - PullRequest
0 голосов
/ 26 сентября 2019

Получение непрерывного исключения при попытке запустить код Python в небольшом каталоге с образцами из 5-20 изображений.

У меня есть учетная запись разработчика в Microsoft (по состоянию на это утро), и я обратился в службу поддержки Azure, ноэта проблема не была решена только через чат.Они попросили меня опубликовать это здесь, так что я извиняюсь, если это прозвучит как наглазник всем остальным!

В этой сети очень мало документации.Может быть, это поможет кому-то еще, потому что это потенциально изменит правила игры для людей в графике и медиа, которые имеют огромное количество неорганизованных изображений, как я.

Обратите внимание, что этот код действительно работал однажды прошлой ночью!Но только один раз.Понятия не имею, что пошло не так!

# API reference :

# https://westus.dev.cognitive.microsoft.com/docs/services/5adf991815e1060e6355ad44/operations/56f91f2e778daf14a499e1fa

# 参考 : https://ledge.ai/microsoft-computer-vision-api/

# 機能概要 : img フォルダ中の画像をAI解析し、ファイルのリネームを行います。

# 使い方 : python3 cv_demo.py

# 注意 : サブスクリプションキーは変更してください


import requests

import glob

import os

import time

import urllib



subscription_key = "i do have a real subscription key don't worry"

assert subscription_key



vision_base_url = "https://westcentralus.api.cognitive.microsoft.com/vision/v2.0/"

analyze_url = vision_base_url + "analyze"



# ファイル名を変更

def file_rename(list_1, list_2):

    for i in range(len(list_1)):

        os.rename(list_1[i], './img/' + list_2[i] + '.jpg')



def ms_computer_vision_api(filepath):

    headers = {'Ocp-Apim-Subscription-Key': subscription_key,'Content-Type': 'application/octet-stream'}

    params = urllib.parse.urlencode({
    # Request parameters
   'visualFeatures': 'Categories,Tags,Description,Faces'
   })





    img = open(filepath, 'rb')

    img_byte = img.read()



    response = requests.post(analyze_url, data=img_byte, headers=headers, params=params)

    response.raise_for_status()



    return response.json()



if __name__ == "__main__":

    # 画像ファイルを配列に格納

    image_file = glob.glob('./img/*')



    vision_file_name = []



    start = time.time()



    # Computer Vision APIにリクエストして結果を取得

    for i in range(len(image_file)):

        json_data = ms_computer_vision_api(image_file[i])



        # 生成された文章を取得

        file_name = json_data['description']['captions'][0]['text']

        vision_file_name.append(file_name)



    # 文章の空白をファイル名用にアンダーバーに修正

    for i in range(len(vision_file_name)):

        vision_file_name[i] = vision_file_name[i].replace(' ', '_')



    file_rename(image_file,vision_file_name)



    # 経過時間を出力

    print("elapsed_time:{0}".format(time.time() - start) + "[sec]")
 File "C:\Users\MyName\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\requests\models.py", line 940, in raise_for_status
    raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 429 Client Error: Too Many Requests for url: https://renameimages.cognitiveservices.azure.com/vision/v2.0/analyze?visualFeatures=Description

1 Ответ

1 голос
/ 27 сентября 2019

На основании вашего кода эта ошибка происходит из цикла, который запрашивает когнитивный API.

На самом деле каждая когнитивная служба имеет ограничение TPS (транзакций в секунду) и сообщит об ошибке 429 при превышении TPS.Даже если конкретная когнитивная служба имеет более высокую TPS, например 50 TPS, возможно, у вас все равно есть ошибка 429.Чтобы избежать 429 в будущем, всегда следует использовать следующую политику.

Ниже приведено объяснение 429 и способ обработки 429.

  1. HTTP 429 будет означать RateLimitExceeded,Это означает, что вы делаете слишком много вызовов API в секунду или минуту.

  2. Когда происходит HTTP 429, вы должны подождать некоторое время для повторного вызова API, иначе в следующем вызове API будет отказано.Обычно мы повторяем операцию, используя что-то вроде экспоненциальной политики повторных попыток отката для обработки ошибки 429:

2.1) Вам необходимо проверить код ответа HTTP в своем коде.

2.2) Если код ответа HTTP равен 429, повторите эту операцию через N секунд, которые вы можете определить самостоятельно, например, 10 секунд ...

Например, ниже приведен ответ 429. Вы можете установить время ожиданиявремя как (26 + n) секунд.(PS: здесь вы можете определить n самостоятельно, например, n = 5…)

{
    "error":{
       "statusCode": 429,
        "message": "Rate limit is exceeded. Try again in 26 seconds." 
    }
}

2.3) Если шаг 2 выполнен успешно, продолжите следующую операцию.

2.4) Если шаг 2Сбой также с 429, повторите эту операцию через N * N секунд (вы также можете определить ее самостоятельно), что является экспоненциальной политикой повторного отката.

2.5) Если шаг 4 завершается неудачно и с 429, повторите эту операциюпосле N N N секунд…

2.6) Вы всегда должны ждать успешного завершения текущей операции, и время ожидания будет экспоненциально расти.

...