App Engine:time.sleep()是否计入配额?
你好。我正在开发一个使用 Google Maps API 进行地理编码的 App Engine 应用。因为 Google Maps 不喜欢请求太多,所以我在每次请求之间加了 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}
结果显示,调用 time.sleep(3)
消耗了 3 秒的 CPU 时间。现在我在想,这种调用是否会算入 GAE 提供的配额限制。如果算的话,还有什么其他方法可以在 API 调用之间添加延迟呢?
谢谢。
4 个回答
2
我比较确定,队列任务也会算在你在GAP中使用的CPU资源里。至于sleep()
,我觉得用它不会对CPU造成“惩罚”,但我认为这样写代码不好。
那为什么要用sleep呢?在你的任务中,可以先做一次地理编码,然后在3秒后再把自己放回队列中。看看参数countdown
,在调用http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#add的时候。
17
你肯定不想在一个完全为了快速处理请求而设计的系统里试图入睡 :D
你可以做的事情是为每个地理编码创建一个任务,(可以看看deferred库)。你需要为这个任务指定一个队列,然后把队列的速率限制设置为你觉得地图地理编码器能接受的速度。
这样每个地理编码都会运行,而且你不会超过你设定的速率限制,也不需要做太多复杂的设置。