google-app-engine – 在appstats中看不到NDB tasklet

为什么
appstats中不存在@ ndb.tasklet修饰的方法中的行号?

在我们的应用程序中,我们有一个约定包括同步和异步版本的函数,如:

def do_something(self, param=None):
    return self.do_something_async(param=param).get_result()

@ndb.tasklet
def do_something_async(self, param=None):
    stuff = yield self.do_something_else_async(stuff=param)
    # ...
    raise ndb.Return(stuff)

…但是即使将appegnine_config.appstats_MAX_STACK设置为巨大的东西并清空appengine_config.appstats_RE_STACK_SKIP,appstats中的报告仍会在第一次调用some_tasklet.get_result()时保留我的应用程序代码.

这是appstats的一个例子:

learn.get_list_of_cards_to_learn()中的展开堆栈帧只返回self.get_list_of_cards_to_learn_async().get_result(),这是一个tasklet,后者又调用一堆其他tasklet.但是这些tasklet在appstats中都不可见,我看到的只是ndb内部.

我不确定ndb究竟是如何执行这些装饰器的,但是如果我在其中一个装入pdb跟踪并运行我的测试套件,我可以看到堆栈帧一直到我放在tasklet中的pdb行,所以我不明白为什么在appstats中没有.

一些请求导致大量的RPC调用,但我不知道如何弄清楚我的应用程序的哪个部分正在制作它们,因为我无法通过appstats中的第一个tasklet跟踪它.

有什么东西可能需要在appengine_config中微调吗?

最佳答案 这与NDB调度程序管理tasklet的方式有关.你无能为力.

点赞