Тайм-аут для Google App Engine () - PullRequest
       5

Тайм-аут для Google App Engine ()

1 голос
/ 25 декабря 2009

Привет! Я искал группы App Engine Groups, но не смог найти окончательного решения.

Я хочу поместить 1000 сущностей на свой сервер приложений (производственный сервер), но я получаю ошибки тайм-аута, а также 500 ошибок сервера. Он отлично работал в местном развитии.

Чтобы уменьшить нагрузку на Put, я переводил код в спящий режим на 5 секунд после каждых 10 операций. Я все еще получил те же ошибки: (

Пожалуйста, укажите мне правильное направление. Очень ценю ваши идеи.

Код:

class User(db.Model)
   nickname = db.StringProperty()
   feed = db.StringListProperty()

class Initialize(webapp.RequestHandler):
  def get(self):
    self.response.headers['Content-Type'] = 'text/plain'
    start = 0
     end = 10

  #add 1000 users ( 10 Puts x 100 rows )
  for row in range(1,100):
    for i in range(start,end):
      nickname = "nickname" + str(i)
      feed = ["string1","string2","string3","string4","string5"]

      User(key_name=str(i),nickname=nickname,feed=feed).put()

      self.response.out.write('Entry %s done\n' % i)

    #add counters by 10
    start = start + 10
    end = end + 10

    #sleep
    time.sleep(5)

  self.response.out.write('Initialized 1000 users for Datastore.')

Ответы [ 5 ]

2 голосов
/ 25 декабря 2009

Я бы посоветовал вам разбить записи на пакеты, так как операции записи занимают много времени, в противном случае вы превысите максимальное использование ЦП AppEngine на запрос. Правильный способ разбить на партии - это иметь несколько отдельных запросов, каждый из которых добавляет небольшое количество записей.

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

1 голос
/ 30 декабря 2012

Кажется, для пута существует ограничение в 500 единиц (). Смотри: http://blog.dantup.com/2010/01/google-app-engine-benchmarks-db-put-performance

1 голос
/ 26 декабря 2009

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

1 голос
/ 25 декабря 2009

Что еще нужно учитывать, это то, что GAE иногда выдает ошибки / тайм-ауты по первому запросу после периода бездействия приложения. Похоже, что "пробуждение" приложения занимает некоторое время, если оно неактивно в течение нескольких часов, поэтому первый запрос после такого времени почти автоматически выдает ошибку.

Вы пытались повторно выполнить запрос после первоначального сбоя?

1 голос
/ 25 декабря 2009

Я переводил код в спящий режим на 5 секунд после каждых 10 операций

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

Вам нужно разделить свою работу по нескольким запросам, например, используя очередь задач.

...