App Engine: Является ли time.sleep() подсчетом к моим квотам?

Эй. Я работаю над приложением App Engine, которое включает запросы к API Карт Google для геокодирования. 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}

Итак, он говорит, что он потребляет 3 секунды процессора для time.sleep(3). Теперь мне интересно, учитываются ли подобные вызовы в отношении ограничений квот, предоставляемых GAE. И если это так, каков другой способ сделать задержки между вызовами API для геокодирования?

Спасибо.

Ответ 1

Вы, конечно же, не хотите спать в системе, которая полностью разработана с нуля, чтобы завершить запросы в максимально короткие сроки: D

Вместо этого вы можете создать задачу для каждого геокода (проверьте отложенную библиотеку). Вы хотите указать очередь для этой задачи, а затем просто установите ограничение скорости в очереди на то, что, по вашему мнению, может быть удобным для геокодирования карт.

Таким образом, каждый геокод будет работать, и вы никогда не будете идти быстрее, чем установленный вами предел скорости, и вам не нужно делать какие-либо сантехнические работы.

Ответ 2

Я уверен, что задачи в очереди также учитывают использование вашего процессора в GAP. Что касается sleep(), я не думаю, что из этого будет "штраф" CPU, но я думаю, что это плохой стиль.

Зачем спать вообще? В своей задаче сделайте одно геокодирование и просто разместите еще один вызов для себя в очереди за 3 секунды. См. Параметр countdown При вызове http://code.google.com/intl/el/appengine/docs/python/taskqueue/functions.html#add.

Ответ 3

Ваш эксперимент доказывает, что время time.sleep подсчитывается против вашей квоты. Посмотрите на экспериментальный API очереди задач. Если ваша задача не инициирована пользователем, вы также можете использовать Cron задачи, но я не знаю, будет ли это работать с таким небольшие интервалы.

Ответ 4

Этот Issue сообщает, что репортеру не было выставлено счета за секунды процессора, вызванные time.sleep(), но они появляются на их appstats. Очень вероятно, что appstats также использует cprofile. Сон очень важен для людей, пытающихся улучшить асинхронные прокси, которые он мог бы использовать для геокодирования большего набора предметов.

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