【发布时间】:2015-05-15 18:11:29
【问题描述】:
我在 ConceptNet API 上遇到了查询上限问题。我正在为数千个单词的词汇表中的每个单词下载一个查询,但 API 将查询限制为每分钟 600 次调用。如果我从一个脚本发送查询,我可以简单地每 0.1 秒(1 分钟/600 次呼叫)拨打一次电话。但是,我正在使用多个同时查询 API 的进程。
我目前的方法是使用JoinableQueue 来跟踪调用了多少查询。当队列有 600 个元素时,我暂停执行一分钟。
这似乎不是最省时的解决方案,因为如果 600 次调用需要超过 1 分钟才能完成,则服务器的计时器已经重置(我假设)。
是否有更省时的解决方案来避免上限?
【问题讨论】:
-
在您评论之前我删除了它,因此重新发布:您可以在您的
multiprocessing.Pool/Queue中发送600 个工作项,然后在父母那里睡一分钟吗?然后一分钟后,再发送600,再次睡觉,等等?这样,您将在发送新请求之前从第一个请求开始大约一分钟后睡觉。不过,如果不确切了解 ConceptNet 最终如何计算事物,就很难确切地说出最佳方法是什么。 -
@dano(那我也会转发我的评论。:))我喜欢!我会试试这个。
-
@dano 进一步考虑,我发现这个建议存在问题。查询需要时间才能完成。在最坏的情况下,如果一小部分查询时间超过 60 秒,则新查询开始堆积在队列中,然后全部一起执行。但它给了我一个替代方案的想法,当队列低于 600 时,我可以每 0.1 秒向队列添加一个查询。
-
see how
RatedSemaphore(10)is used to rate limit requests(将导入从threading更改为multiprocessing-- 否则代码应该相同)
标签: python time multiprocessing