python - 与第 3 方 API 交互时,定时处理时间以处理每分钟的请求限制

标签 python

因此,第 3 方针对某些限制值收取不同的费用。这么说吧,我很便宜,不想为无限制的访问支付全额费用。

我使用的方法相当简单,我只是在处理每个请求后调用 sleep 3 秒(支付每分钟 20 次调用的计划)。

这里是一些用于说明的剪辑代码:

import requests
import sqlite3
from time import sleep

timetosleep = 3
conn = sqlite3.connection('db.db')
c = conn.cursor()
keys = [
    "A BIG LIST, SOMETHING LIKE len == 80K" #working with 500 at a time
]

def treatResponse(response):
    #series of validations, some regex and stuff
    returns "A TUPLE WITH DATA TO THE SQLITE DB"

for key in keys:
    response = requests.get("API ADDRESS AND KEYS", {"auth":"auth"})
    #if response is GREAT! yadayada
    c.execute(
           """INSERT INTO tbl(field1, field2) values(?, ?)""",
              treatResponse(response.json()))
    conn.commit()
    sleep(timetosleep)

由于用于处理响应的函数相当昂贵,需要一堆连续的正则表达式调用,并且服务器可能需要很长时间(相对于限制/分钟)来响应,因此等待 3 可能有点过分了整整几秒(甚至根本等待)。

有人有一个解决方案来计时每次迭代吗? 如果这个操作做得很好,它可以用来减少 sleep 定时器并大大提高性能。 TIA

最佳答案

也许将您的 for 循环设置为使用最大阈值进行迭代,而不是显式等待:

for key in keys:
    start = time.time()
    response = requests.get("API ADDRESS AND KEYS", {"auth:auth"})
    #if response is GREAT! yadayada
    c.execute(
           """INSERT INTO tbl(field1, field2) values(?, ?)""",
              treatResponse(response.json()))
    conn.commit()

    timetosleep = 3. - (time.time()-start)
    if timetosleep<0:
        continue
    sleep(timetosleep)

这样,如果你的函数花费超过 3 秒,它就不会休眠,否则它将等待剩余时间

关于python - 与第 3 方 API 交互时,定时处理时间以处理每分钟的请求限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51748968/

相关文章:

python - Django 1.8 错误的 PyDev 错误

python - 如何更新 django cached_property

同时交叉和添加列表元素的 Pythonistic 方法

python - 有没有办法阻止 buildozer 克隆 python-for-android?

python - Heroku 上的 TCP/IP 套接字

python - 尝试从 Spyder 加载 HDFS 文件时连接被拒绝

python - 优化 Pandas 计算

python - crontab 运行脚本

python - 如何在Python中尽快获取像素的颜色?

python - DataFrame 按元素除以行总和