我曾使用Appstats在我的GAE项目中记录我的ndb使用情况,并且效果非常好。我的Appstats设置正在关注this doc。
最近,我移动了一些ndb代码在后台线程上执行,但那些ndb调用不再显示在Appstats控制台UI上。
我在dev和prod中都尝试过Appstats,它们不会记录在后台线程中创建的ndb RPC。
为了明确问题,我的意思是: Appstats适用于:
class MyHandler(webapp2.RequestHandler):
def put(self):
...
do_a_lot_of_ndb_work()
...
但Appstats不适用于:
class MyHandler(webapp2.RequestHandler):
def put(self):
...
background_thread.start_new_background_thread(do_a_lot_of_ndb_work, [])
...
我可以更改appengine_config.py中的某些参数或做些什么来使Appstats适用于这两个参数吗?
更新: 上面的代码片段在后端运行(basic_scaling,max_instances = 1),并且线程使用从https://developers.google.com/appengine/docs/python/modules/#Python_Background_threads引用
答案 0 :(得分:1)
你不应该这样使用线程。执行运行时间超过60秒请求窗口的函数的正确方法是使用Taskqueue API。在任务超时之前,这会给你一个10分钟的窗口。
https://developers.google.com/appengine/docs/python/taskqueue/
如果你真的需要做更多的处理,请考虑使用后端。
https://developers.google.com/appengine/docs/python/backends/
如果您希望以异步方式运行ndb调用以获得性能,那么此处描述的tasklet装饰器非常出色并且强烈推荐:
https://developers.google.com/appengine/docs/python/ndb/async
(SDK的最新版本1.8.4允许您使用@transactional_tasklet装饰器在tasklet中运行事务。)
我将所有这三种方法用于不需要占用主请求线程的东西,并且appstats在所有这些情况下运行良好。
你还应该好好看看你正在尝试做什么,看看它是否可以合理地分成更小的块,因为如果你需要超过10分钟的时间进行处理,它可能会花费很多