Является ли get_result () обязательным вызовом для put_async () в Google App Engine - PullRequest
14 голосов
/ 19 мая 2011

С новой версией GAE 1.5.0 у нас теперь есть простой способ выполнять асинхронные вызовы хранилища данных.Должны ли мы звонить get_result() после вызова ' put_async '?

Например, если у меня есть модель с именем MyLogData, могу ли я просто позвонить:

put_async(MyLogData(text="My Text"))

прямо перед тем, как мой обработчик вернется без вызова соответствующего get_result()?GAE автоматически блокирует любые ожидающие вызовы перед отправкой результата клиенту?

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

Ответы [ 3 ]

7 голосов
/ 09 июня 2011

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

Я написал простой обработчик:

class DB_TempTestModel(db.Model):
    data = db.BlobProperty()

class MyHandler(webapp.RequestHandler):
    def get(self):
        starttime = datetime.datetime.now()
        lots_of_data = ' '*500000
        if self.request.get('a') == '1':
            db.put(DB_TempTestModel(data=lots_of_data))
            db.put(DB_TempTestModel(data=lots_of_data))
            db.put(DB_TempTestModel(data=lots_of_data))
            db.put(DB_TempTestModel(data=lots_of_data))
        if self.request.get('a') == '2':
            db.put_async(DB_TempTestModel(data=lots_of_data))
            db.put_async(DB_TempTestModel(data=lots_of_data))
            db.put_async(DB_TempTestModel(data=lots_of_data))
            db.put_async(DB_TempTestModel(data=lots_of_data))
        self.response.out.write(str(datetime.datetime.now()-starttime))

Я запускал его несколько раз в приложении с высокой репликацией.

Данные быливсегда рядом, заставляя меня верить, что если не произойдет сбой в стороне хранилища данных (маловероятно), она будет написана.

Вот интересная часть.Когда данные записываются с помощью put_async() (?a=2), количество времени (для обработки запроса) в среднем примерно в 2–3 раза превышало put() (?a=1) (не очень научный тест- просто взглянув на это).

Но cpu_ms и api_cpu_ms были одинаковыми как для ?a=1, так и ?a=2.

Из журналов:

ms=440 cpu_ms=627 api_cpu_ms=580 cpm_usd=0.036244

против

ms=149 cpu_ms=627 api_cpu_ms=580 cpm_usd=0.036244

На стороне клиента, глядя на сетевую задержку запросов, он показал те же результаты, то есть `? A =2 'запросы были как минимум в 2 раза быстрее.Определенно победа на стороне клиента ... но, похоже, на стороне сервера это не принесет пользы.

Кто-нибудь из команды GAE хочет прокомментировать?

3 голосов
/ 25 июня 2012

db.put_async прекрасно работает без get_result при развертывании (в стиле "забей и забудь"), но в локально не будет действовать до тех пор, пока не будет вызван get_result больше контекста

2 голосов
/ 19 мая 2011

Я не знаю, но это работает:

import datetime
from google.appengine.api import urlfetch

def main():
  rpc = urlfetch.create_rpc()
  urlfetch.make_fetch_call(rpc, "some://artificially/slow.url")
  print "Content-type: text/plain"
  print
  print str(datetime.datetime.now())

if __name__ == '__main__':
  main()

Удаленный URL спит 3 секунды, а затем отправляет мне электронное письмо. Обработчик App Engine немедленно возвращается, и удаленный URL завершается, как и ожидалось. Поскольку обе службы абстрагируют одну и ту же базовую инфраструктуру RPC, я думаю, хранилище данных ведет себя одинаково.

Хороший вопрос, хотя. Возможно, Ник или другой Гуглер могут ответить однозначно.

...