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()。これは、一連の他のタスクレットを順番に呼び出すタスクレットです。ただし、これらのタスクレットは appstats には表示されず、ndb内部のみが表示されます。

ndbこれらのデコレータがどのように正確に実行されているかはわかりませんがpdb、そのうちの 1 つにトレースを入れてテスト スイートを実行すると、スタック フレームをpdbタスクレットに入れた行までずっと見ることができるので、 appstats にそれがない理由がわかりません。

一部のリクエストは大量の RPC 呼び出しを引き起こしますが、appstats の最初のタスクレットを過ぎて追跡できないため、アプリのどの部分がそれらを行っているかを特定する方法がわかりません。

微調整が必​​要なものはありappengine_configますか?

4

1 に答える 1

2

これは、タスクレットが NDB のスケジューラによって管理される方法に関係しています。あなたがそれについてできることはあまりありません。

于 2013-01-13T16:42:05.517 に答える