Можно ли увеличить время ожидания ответа в Google App Engine? - PullRequest
5 голосов
/ 02 июня 2010

На моей локальной машине скрипт работает нормально, но в облаке он все время 500. Это задача cron, поэтому я не против, если это займет 5 минут ...

:

Есть идеи, можно ли увеличить время ожидания?

Спасибо, Руи

Ответы [ 3 ]

9 голосов
/ 02 июня 2010

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

EDIT

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

http://code.google.com/intl/pl/appengine/docs/python/datastore/queriesandindexes.html#Query_Cursors

впервые представлен в SDK 1.3.1:

http://googleappengine.blogspot.com/2010/02/app-engine-sdk-131-including-major.html

7 голосов
/ 03 августа 2012

Точные правила для тайм-аутов запросов к БД сложны, но кажется, что запрос не может существовать более 2 минут, а пакет не может длиться более 30 секунд.Вот некоторый код, который разбивает задание на несколько запросов, используя курсоры, чтобы избежать этих таймаутов.

def make_query(start_cursor):
  query = Foo()

  if start_cursor:
    query.with_cursor(start_cursor)

  return query

batch_size = 1000
start_cursor = None

while True:
  query = make_query(start_cursor)
  results_fetched = 0

  for resource in query.run(limit = batch_size):
    results_fetched += 1

    # Do something

    if results_fetched == batch_size:
      start_cursor = query.cursor()
      break
  else:
    break
1 голос
/ 08 сентября 2014

Ниже приведен код, который я использую для решения этой проблемы, разбивая один большой запрос на несколько маленьких. Я использую библиотеку google.appengine.ext.ndb - я не знаю, требуется ли это для работы приведенного ниже кода.

(Если вы не используете ndb, подумайте над тем, чтобы перейти на него. Это улучшенная версия библиотеки db и ее легко перенести. Для получения дополнительной информации см. https://developers.google.com/appengine/docs/python/ndb.)

from google.appengine.datastore.datastore_query import Cursor

def ProcessAll():
  curs = Cursor()
  while True:
    records, curs, more = MyEntity.query().fetch_page(5000, start_cursor=curs)
    for record in records:
      # Run your custom business logic on record.
      RunMyBusinessLogic(record)
    if more and curs:
      # There are more records; do nothing here so we enter the 
      # loop again above and run the query one more time.
      pass
    else:
      # No more records to fetch; break out of the loop and finish.
      break
...