【发布时间】:2012-03-13 02:48:38
【问题描述】:
我最近在一个带有异步调用的 appengine 应用程序中替换了许多 sycnronous db.put 调用。我不需要在请求的其余部分使用这些数据,所以最初我只是以一种即发即弃的方式调用 put_async 函数。然后我在SO上看到了这篇文章: Appengine: put_async doesn't work (at least in the development server)? ,以及来自应用引擎工程师的回复说您必须在异步对象上调用 wait 或 get_result 以保证它被写入。
所以在我的测试中,所有 put_async 调用都工作正常,但我想确定一下,所以我添加了一个带有变量的全局模块,我可以在所有其他模块中访问该变量,并在每次调用时存储 async ref put_async 在应用程序中。 IE: APP_GLOBALS.async_db_calls.append(db.put_async(whatever_db_model))
然后,我使用 atexit 注册了一个关闭函数,该函数遍历此请求的所有 asycn 调用,并在它们上调用 wait() 以确保它们已写入数据存储区。
这工作,但我注意到在此更改后性能极度下降...有没有人对此有任何见解,或者知道更好的方法来使用异步调用进行写入而无需关机功能?
【问题讨论】:
-
呃,你能详细说明一下为什么需要关机功能吗?您链接到的关于
put_async的问题没有任何关于它的要求... -
在响应完成后,为了方便起见,将其用作单个位置以完成所有异步调用(而不是在异步调用之后零碎等待/get_result 调用)
-
你为什么觉得有必要“敲定”它们?
-
哎呀..我最初引用了错误的 SO 问题。刚刚修好了。正如您将从问题中看到的那样,Nick 表示有必要保证写入成功。
标签: python google-app-engine datastore