每个请求延迟1秒,不足3600/小时

2024-09-26 18:09:45 发布

您现在位置:Python中文网/ 问答频道 /正文

amazonapi的限制显然是每秒1个请求或每小时3600个请求。所以我是这样实施的:

while True:
    #sql stuff
    time.sleep(1)
    result = api.item_lookup(row[0], ResponseGroup='Images,ItemAttributes,Offers,OfferSummary', IdType='EAN', SearchIndex='All')
    #sql stuff

错误:

amazonproduct.errors.TooManyRequests: RequestThrottled: AWS Access Key ID: ACCESS_KEY_REDACTED. You are submitting requests too quickly. Please retry your requests at a slower rate.

有什么想法为什么?在


Tags: apitruesqltimesleepresultlookupitem
2条回答

电脑时代很有趣

这篇文章说的“它以非确定性的方式变化”(https://stackoverflow.com/a/1133888/5044893)是正确的。根据一系列因素,处理器测量的时间可能相当不可靠。在

亚马逊的API与你的程序有着不同的时钟,这一点更是雪上加霜。它们肯定是不同步的,而且它们的“1秒”时间测量值和你的程序时间测量值之间可能有一些重叠。很可能亚马逊试图平均这种不一致性,而且它们也可能允许有一点误差,可能是+/-5%。即便如此,你的时钟和他们的时钟之间的差异可能会触发ACCESS_KEY_REDACTED信号。在

给自己一些缓冲

下面是一些需要考虑的问题。在

你真的需要每一秒都访问amazonapi吗?你的程序能以5秒的间隔工作吗?即使是2秒的间隔,触发锁定的可能性也会降低200%。另外,亚马逊可能会对你的每一个服务电话收费,所以间隔时间可以节省你的钱。在

这实际上是一个“优化”的问题。如果使用常量变量来控制API调用率(例如,SLEEP = 2),那么可以轻松地调整该速率。摆弄它,增加或减少它,看看你的程序如何执行。在

推,不是拉

有时,每秒访问一个API意味着您在轮询新数据。轮询是出了名的浪费,这就是amazonapi有速率限制的原因。在

你可以换一种基于队列的方法吗?amazonsqs可以在你的程序中触发事件。如果你用Amazon Lambda托管它们,这就特别容易了。在

这段代码看起来是正确的,而且看起来1个请求/秒的限制仍然是实际的: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/TroubleshootingApplications.html#efficiency-guidelines

您要确保没有其他进程使用相同的关联帐户。根据运行代码的位置和方式,可能会有一个旧版本的VM,或者正在运行的应用程序的另一个实例,或者可能有一个版本在云上,另一个在你的笔记本上,或者如果你使用的是线程化的web服务器,可能有多个线程都在运行相同的代码。在

如果您仍然达到查询限制,那么您只想重试一次,可能使用类似TCP的“加法增加/乘法减少”返回。首先设置extra_delay = 0。当请求失败时,设置extra_delay += 1和{},然后重试。当它最终成功时,设置extra_delay = extra_delay * 0.9。在

相关问题 更多 >

    热门问题