10

嘿。我正在开发一个 App Engine 应用程序,该应用程序涉及对 Google Maps API 进行地理编码的查询。谷歌地图不喜欢太多的请求,所以我在每个请求之间设置了 1 秒的延迟time.sleep(1)

我注意到我的 GAE 仪表板中的配额不足,因此决定运行一个简短的测试:

import cProfile
import time

def foo():
    time.sleep(3)

cProfile.run('foo()')

这给了我以下输出:

   4 function calls in 3.003 CPU seconds
   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    3.003    3.003 <stdin>:1(foo)
        1    0.000    0.000    3.003    3.003 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}
        1    3.003    3.003    3.003    3.003 {time.sleep}

所以它说它消耗 3 个 CPU 秒time.sleep(3)。现在我想知道这样的调用是否计入 GAE 提供的配额限制。如果确实如此,那么在地理编码的 API 调用之间产生延迟的另一种方法是什么?

谢谢。

4

4 回答 4

17

你当然不想在一个完全从头开始设计的系统中睡觉,以便在绝对最短的时间内完成请求:D

您可以做的是为每个地理编码创建一个任务(查看延迟库)。您想为此任务指定一个队列,然后只需将队列的速率限制设置为您认为地图地理编码器可能会感到舒服的任何值。

这样,每个地理编码都会运行,并且您的速度永远不会超过您设置的速率限制,并且您不需要做任何管道。

于 2010-11-23T10:03:50.100 回答
2

我相当肯定队列任务也计入 GAP 中的 CPU 使用率。关于sleep(),我认为这不会对 CPU 造成“惩罚”,但我认为这是一种糟糕的风格。

为什么要睡觉?在您的任务中,进行一次地理编码,然后在 3 秒内将另一个调用发布到队列中。countdown请参阅调用http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#add时的参数。

于 2010-11-23T11:00:26.523 回答
1

您的实验证明 time.sleep 时间计入您的配额。看看实验性的任务队列 API。如果您的任务不是用户发起的,您也可以使用Cron任务,但我不知道这是否能在如此短的时间间隔内正常工作。

于 2010-11-23T09:56:23.197 回答
1

问题报告报告者没有为 time.sleep() 产生的 cpu 秒数计费,但它们显示在他们的 appstats 上。appstats 很可能也使用 cprofile。睡眠对于试图制作更好的异步代理的人来说很重要,他可以使用这些代理对更大的项目集进行地理编码。

http://code.google.com/p/googleappengine/issues/detail?id=3291

于 2010-11-24T21:10:30.543 回答