我最近在一个带有异步调用的appengine应用程序中替换了许多同步的db.put调用。我不需要在请求的其余部分使用这些数据,所以最初我只是以一种即发即忘的方式调用put_async函数。然后我在SO上发现了这篇文章: Appengine: put_async doesn't work (at least in the development server)?,以及来自应用引擎工程师的回复,说您必须在异步对象上调用wait或get_result以保证其已写入。
所以在我的测试中,所有put_async调用都运行正常,但我想确定所以我添加了一个带有变量的全局模块,我可以访问所有其他模块并在每次调用时存储异步引用在应用程序中put_async。即: APP_GLOBALS.async_db_calls.append(db.put_async(whatever_db_model))
然后我用atexit注册了一个关闭函数,该函数遍历所有对此请求的asycn调用,并对它们调用wait()以保证它们被写入数据存储区。
这个有效但是我注意到这次改变后性能极度下降......有没有人对此有任何见解,或者知道更好的方法来使用asycncalls进行写操作而不需要关机功能?
答案 0 :(得分:0)
NDB API具有极大的功能,可以帮助您解决此问题。但是,在请求完成之前,您始终必须等待RPC调用完成,这不是您可以避免的。调用数据存储区API的* _async对应方不允许您在请求之外工作。