Вызовы API очереди задач AppEngine увеличиваются при появлении TaskAlreadyExistsError - PullRequest
2 голосов
/ 26 августа 2011

Я использую deferred, чтобы поместить задачи в очередь по умолчанию в приложении AppEngine, аналогично этому подходу .

Я называю задачу меткой времени, которая меняется каждые 5 секунд,В течение этого времени в очередь с одним и тем же именем делается много вызовов, в результате чего TaskAlreadyExistsError, что нормально.Проблема заключается в том, что, когда я проверяю квоты, «вызовы API очереди задач» увеличиваются для каждого сделанного вызова, а не только для тех, кто фактически помещен в очередь.

Я имею в виду, если вы посмотрите на квоту: Task Queue API Calls: 34,017 of 100,000 и сравните с фактическими вызовами очереди: /_ah/queue/deferred - 2.49K

Вот код, который обрабатывает очередь:

try:
  deferred.defer(function_call, params, _name=task_name, _countdown=int(interval/2))
except (taskqueue.TaskAlreadyExistsError, taskqueue.TombstonedTaskError):
  pass

Полагаю, так оно и работает.Есть хороший способ решить проблему с квотой?Могу ли я использовать memcache для хранения task_name и проверить, была ли добавлена ​​задача помимо вышеупомянутого try / catch?Или есть способ проверить, существует ли уже задание, не используя вызовы API очереди задач?

Ответы [ 2 ]

2 голосов
/ 26 августа 2011

Спасибо, что указали на то, что это так, потому что я не осознавал, но та же самая проблема, должно быть, затрагивает меня.имя задачи должно работать нормально, и затем, если вы хотите уменьшить эти попадания в memcache, вы можете хранить флаг локально также в пределах экземпляра.

0 голосов
/ 30 августа 2011

«Хороший способ» решения проблемы с квотами - исключение вызовов, предназначенных для сбоя, в API-интерфейс очереди задач.

_name вы используете изменения каждые 5 секунд, что может быть не узким местом, если выувеличить скорость выполнения вашей очереди задач.Но вы также добавляете Задачи, используя _countdown.

...