App Engine:time.sleep()是否计入配额?

10 投票
4 回答
5159 浏览
提问于 2025-04-16 07:29

你好。我正在开发一个使用 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 个回答

1

你的实验表明,time.sleep的时间会算在你的配额里。可以看看这个实验性的 任务队列API。如果你的任务不是由用户发起的,你也可以使用 定时任务,不过我不确定这样做在很短的时间间隔下效果如何。

2

我比较确定,队列任务也会算在你在GAP中使用的CPU资源里。至于sleep(),我觉得用它不会对CPU造成“惩罚”,但我认为这样写代码不好。

那为什么要用sleep呢?在你的任务中,可以先做一次地理编码,然后在3秒后再把自己放回队列中。看看参数countdown,在调用http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#add的时候。

17

你肯定不想在一个完全为了快速处理请求而设计的系统里试图入睡 :D

你可以做的事情是为每个地理编码创建一个任务,(可以看看deferred库)。你需要为这个任务指定一个队列,然后把队列的速率限制设置为你觉得地图地理编码器能接受的速度。

这样每个地理编码都会运行,而且你不会超过你设定的速率限制,也不需要做太多复杂的设置。

撰写回答