GAE-Python:Appstats可以记录在后台线程中创建的RPC吗?



我使用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 分钟的处理时间,它可能会花费很多。

相关内容

  • 没有找到相关文章

最新更新