Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在谷歌应用程序引擎中设置异步慢_Python_Google App Engine_Datastore - Fatal编程技术网

Python 在谷歌应用程序引擎中设置异步慢

Python 在谷歌应用程序引擎中设置异步慢,python,google-app-engine,datastore,Python,Google App Engine,Datastore,我最近在appengine应用程序中用异步调用替换了许多Syncronous db.put调用。我不需要在请求的其余部分使用这些数据,所以最初我只是以一种fire-and-forget的方式调用put\u异步函数。然后我在网上看到了这篇文章: ,以及来自应用程序引擎工程师的响应,该工程师说您必须调用wait或获取异步对象上的_结果,以确保它被写入 因此,在我的测试中,所有put_async调用都工作正常,但我想确保,因此我添加了一个全局模块,其中包含一个变量,我可以跨所有其他模块访问该变量,并在

我最近在appengine应用程序中用异步调用替换了许多Syncronous db.put调用。我不需要在请求的其余部分使用这些数据,所以最初我只是以一种fire-and-forget的方式调用put\u异步函数。然后我在网上看到了这篇文章: ,以及来自应用程序引擎工程师的响应,该工程师说您必须调用wait或获取异步对象上的_结果,以确保它被写入

因此,在我的测试中,所有put_async调用都工作正常,但我想确保,因此我添加了一个全局模块,其中包含一个变量,我可以跨所有其他模块访问该变量,并在每次调用put_async时将async ref存储在应用程序中。即: APP\u GLOBALS.async\u db\u calls.append(db.put\u async(无论什么\u db\u模型))

然后,我向atexit注册了一个shutdown函数,该函数迭代该请求的所有asycn调用,并对它们调用wait(),以确保它们被写入数据存储


这是可行的,但我注意到在这一变化后,性能急剧下降。。。有没有人对此有什么见解,或者知道一种更好的方法来使用asycncalls for write而不必关闭功能?

NDB API的功能将极大地帮助您实现这一点。但是,在请求完成之前,您必须始终等待RPC调用完成,这是无法避免的。调用数据存储API的*_异步对应项不允许您在请求之外工作


呃,你能详细说明一下为什么需要关机功能吗?您链接到的关于
put\u async
的问题没有任何关于它的要求……只是为了方便起见,在响应完成后将其作为一个单独的位置来完成所有异步调用(而不是在异步调用后分段等待/获取结果调用),为什么您觉得需要“完成”它们?哇。。最初我引用了错误的SO问题。刚刚修好了。正如您将从问题中看到的,Nick指出,确保写入成功是必要的。因此,如果我理解正确,除了检查所有RPC是否在关闭函数中完成之外,基本上我唯一的选择是:1)在对该上下文有意义的情况下,单独处理每个“futures”对象,或者2)用@context.toplevel修饰我的所有处理程序函数。进一步研究后,NDB将不适用于我的大多数数据存储,因为它不支持我广泛使用的许多属性(例如ReferenceProperty),您总是希望用@context.toplevel修饰,这使您无需跟踪所做的异步调用即可执行代码,还可以创建用于进一步并发的Tasklet。如果您需要保证您的写入,那么您唯一的选择,AFAIK,就是检查每个未来,调用get_result()并观察异常。这可能不会比您当前的方法好多少(尽管只有测试会告诉您),但至少它是由SDK提供的,并且可能会简化您的代码。尝试执行代码的一小部分,并检查它是否有帮助。对于引用属性,有一个解决方法:,您可以迁移到新的属性名称,并在原始属性名称的函数上使用@property decorator来覆盖此新语法,而无需更新所有代码。我相信您最了解自己的代码,而对于一个已建立和正在生产的应用程序来说,迁移到NDB API绝非易事!感谢您的评论-浏览NDB文档更多,将我的数据存储转换为NDB将是一个非常大的项目。与此同时,我无法让@context.toplevel正常工作。使用Python2.7、webapp2和装饰分派函数。。。上下文装饰器是否仅在NDB api中可用?