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

时间:2013-09-17 14:34:20

标签: google-app-engine python-2.7 webapp2 app-engine-ndb appstats

我曾使用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引用

1 个答案:

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