【问题标题】:How can I slow queries to API to prevent query cap with multiprocessing?如何减慢对 API 的查询以防止多处理查询上限?
【发布时间】: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


【解决方案1】:

我认为只需对执行 API 调用的代码的每个部分进行计时,并在剩余的 0.1 秒内休眠。我已经做了类似于测试工具的速率限制输出的事情,例如:

for x in xrange(event_count):

    start = time.time()
    yield json.dumps(m.get_mock()) + '\n'
    elapsed = time.time() - start
    time.sleep(max((1 / hits_sec) - elapsed, 0))

【讨论】:

    猜你喜欢
    • 2017-08-11
    • 2022-07-17
    • 2019-11-22
    • 2014-01-30
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多