0

我曾使用 Appstats 记录我在 GAE 项目中的 ndb 使用情况,效果非常好。我的 Appstats 设置遵循此文档

最近,我移动了一些 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

4

1 回答 1

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 分钟的时间来进行处理,这可能会花费很多。

于 2013-09-17T14:45:26.723 回答