谷歌翻译api超时

sac*_*ruk 6 python rest try-catch google-translate

我有大约 20000 条文本要翻译,每条平均长度约为 100 个字符。我正在使用多处理库来加速我的 API 调用。看起来像下面:

from google.cloud.translate_v2 import Client
from time import sleep
from tqdm.notebook import tqdm
import multiprocessing as mp

os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = cred_file
translate_client = Client()

def trans(text, MAX_TRIES=5):
    res = None
    sleep_time = 1
    for i in range(MAX_TRIES):
        try:
            res = translate_client.translate(text, target_language="en", model="nmt")
            error = None
        except Exception as error:
            pass

        if res is None:
            sleep(sleep_time)  # wait for 1 seconds before trying to fetch the data again
            sleep_time *= 2
        else:
            break

    return res["translatedText"]

src_text = # eg. ["this is a sentence"]*20000
with mp.Pool(mp.cpu_count()) as pool:
    translated = list(tqdm(pool.imap(trans, src_text), total=len(src_text)))
Run Code Online (Sandbox Code Playgroud)

不幸的是,上面的代码每次都在迭代 2828 +/- 5 左右失败 ( HTTP Error 503: Service Unavailable)。我希望有一个可变的睡眠时间可以让它重新启动并正常运行。奇怪的是,如果我立即重新启动循环,它会再次启动而不会出现问题,即使代码完成执行后已经过去了 < 2^4 秒。所以问题是:

  1. try/except做错了吗?
  2. 正在以某种方式进行多处理影响 API。
  3. 一般想法?

我需要多处理,否则我将等待大约 3 个小时才能完成整个过程。

abe*_*rad 6

一些想法,之前尝试过的google API,只能处理一定数量的并发请求,如果达到限制,服务会返回错误HTTP 503Service Unavailable.”。而HTTP 403如果Daily limit is Exceeded还是User Rate Limit

尝试使用指数退避实现重试。以指数方式增加等待时间重试操作,直至达到最大重试次数。它将提高带宽使用率并最大化并发环境中的请求吞吐量。

并查看配额和限制页面