嘿。我正在开发一个App Engine应用程序,该应用程序涉及对Google Maps API的查询以进行地理编码。谷歌地图不喜欢太多的请求,所以我在time.sleep(1)
的每个请求之间放置了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}
所以它说time.sleep(3)
耗费3个CPU秒。现在我想知道这样的呼叫是否计入GAE提供的配额限制。如果确实如此,那么在用于地理编码的API调用之间进行延迟的另一种方法是什么?
感谢。
答案 0 :(得分:17)
你当然不想试图在完全设计的系统中睡觉,以便在绝对最短的时间内完成请求:D
您可以做的是为每个地理编码创建一个任务,(查看deferred library)。您需要为此任务指定一个队列,然后只需将队列上的速率限制设置为您认为地图地理编码器可能感觉舒适的任何内容。
这样每个地理编码都会运行,并且你永远不会超过你设置的速率限制,并且你不需要做任何管道。
答案 1 :(得分:2)
我相当确定队列任务也会计入GAP中的CPU使用率。关于sleep()
,我不认为会有CPU“惩罚”,但我认为这是一种不好的风格。
为什么要睡觉?在您的任务中,执行单个地理编码,只需在3secs中向队列中发送另一个调用。调用http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#add时参见参数countdown
。
答案 2 :(得分:1)
您的实验证明time.sleep时间与您的配额有关。看看实验Task Queue API。如果您的任务不是由用户启动的,那么您也可以使用Cron任务,但我不知道这是否适用于如此小的间隔。
答案 3 :(得分:1)
此Issue报告记者没有因time.sleep()产生的cpu秒而被收费,但是他们出现在他们的appstats上。 appstats很可能也使用cprofile。睡眠对于尝试制作更好的异步代理的人来说非常重要,他可以使用这些代理对更大的项目进行地理编码。
http://code.google.com/p/googleappengine/issues/detail?id=3291