put_async медленно работает в Google App Engine - PullRequest
0 голосов
/ 12 марта 2012

Я недавно заменил много sycnronous вызовов db.put в приложении app на асинхронные вызовы. Мне не нужно использовать эти данные для остальной части запроса, поэтому изначально я просто вызывал функцию put_async методом «забыл и забыл». Тогда я наткнулся на этот пост на SO: Appengine: put_async не работает (по крайней мере, на сервере разработки)? , а ответ инженера ядра приложения говорит, что вы должны вызвать wait или get_result для асинхронного объекта, чтобы гарантировать, что он написан.

Таким образом, в моем тестировании все вызовы put_async работали нормально, но я хотел быть уверенным, поэтому я добавил глобальный модуль с переменной, к которой у меня есть доступ ко всем другим модулям, и сохранял асинхронную ссылку каждый раз, когда был сделан вызов put_async в приложении. то есть: APP_GLOBALS.async_db_calls.append (db.put_async (what_db_model))

Затем я зарегистрировал функцию выключения с помощью atexit, которая перебирает все вызовы asycn для этого запроса и вызывает wait () для них, чтобы гарантировать, что они были записаны в хранилище данных.

Это работает , но я заметил резкое снижение производительности после этого изменения ... Кто-нибудь есть какие-либо идеи по этому поводу, или знаете лучший способ использовать asycncalls для записи без выключения функционировать?

1 Ответ

0 голосов
/ 12 марта 2012

В NDB API есть функции, которые очень помогут вам в этом.Однако вам всегда придется ждать завершения вызовов RPC, прежде чем запрос будет завершен, этого нельзя избежать.Вызов * _async аналогов API хранилища данных не позволяет вам работать вне запросов.

http://code.google.com/appengine/docs/python/ndb/async.html

...