Подсистема приложений: учитывает ли time.sleep () мои квоты? - PullRequest
10 голосов
/ 23 ноября 2010

Эй.Я работаю над приложением 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 для геокодирования?

Спасибо.

Ответы [ 4 ]

17 голосов
/ 23 ноября 2010

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

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

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

2 голосов
/ 23 ноября 2010

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

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

1 голос
/ 25 ноября 2010

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

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

1 голос
/ 23 ноября 2010

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

...