我使用Appstats在我的GAE项目中记录了我的ndb使用情况,它运行良好。我的应用统计设置遵循此文档。
最近,我移动了一些要在后台线程上执行的ndb代码,但是这些ndb调用不再显示在Appstats控制台UI上。
我已经在开发和生产中尝试过Appstats,它们不记录在后台线程中进行的ndb RPC。
为了明确这个问题,我的意思是:Appstats 适用于:
class MyHandler(webapp2.RequestHandler):
def put(self):
...
do_a_lot_of_ndb_work()
...
但应用统计不适用于:
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
你不应该以这种方式使用线程。执行运行时间超过 60 秒请求窗口的函数的正确方法是使用任务队列 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 分钟的处理时间,它可能会花费很多。