4

为什么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。然而,这些小任务在 appstats 中都不可见,我所看到的只是ndb内部。

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

一些请求会导致大量的 RPC 调用,但我不确定如何确定我的应用程序的哪个部分正在生成它们,因为我无法通过 appstats 中的第一个 tasklet 跟踪它。

有什么可能我需要微调的appengine_config吗?

4

1 回答 1

2

这与 NDB 调度程序管理小任务的方式有关。您对此无能为力。

于 2013-01-13T16:42:05.517 回答