2017-12-26 18 views
1

私はトルネードのRequestHandlerのヘルパーデコレータを書いた:「RecursionError:比較に超えた最大再帰の深さ」非同期機能の

def return_response(method): 
    @wraps(method) 
    async def wrapper(self, *args, **kwargs): 
     response = method(self, *args, **kwargs) 
     if inspect.isawaitable(response): 
      response = await response 
     self.set_status(response.status) 
     self.write(response.body) 
    return wrapper 

それが次のエラーで失敗するいくつかの理由:

Traceback (most recent call last): 
    File ".../.venv/lib/python3.6/site-packages/tornado/web.py", line 1511, in _execute 
    result = yield result 
    File ".../.venv/lib/python3.6/site-packages/tornado/gen.py", line 1055, in run 
    value = future.result() 
    File ".../.venv/lib/python3.6/site-packages/tornado/concurrent.py", line 238, in result 
    raise_exc_info(self._exc_info) 
    File "<string>", line 4, in raise_exc_info 
    File ".../.venv/lib/python3.6/site-packages/tornado/gen.py", line 307, in wrapper 
    yielded = next(result) 
    File "<string>", line 6, in _wrap_awaitable 
    File ".../src/http_handlers/decorators.py", line 106, in wrapper 
    response = await response 
    File ".../src/http_handlers/decorators.py", line 106, in wrapper 
    response = await response 
    File ".../src/http_handlers/decorators.py", line 106, in wrapper 
    response = await response 
    [Previous line repeated 959 more times] 
    File ".../src/http_handlers/decorators.py", line 104, in wrapper 
    response = method(self, *args, **kwargs) 
RecursionError: maximum recursion depth exceeded in comparison 

このエラーは、アプリケーションがしばらくアップしているときにのみ表示されます。 Python、Tornadoのバグですか、私のコードが間違っていますか?誰かが同じ問題に遭遇しましたか?

更新

私はこの問題を解決するために管理してきました。まったく別の場所にあった。私はこのデコレータを実行時に__new__メソッドに適用しました。誤って実際のインスタンスではなくclsのメソッドに適用していました。したがって、クラスの新しいインスタンスが作成されるたびに、メソッドが再びラップされていました。

+2

「応答待ち」の内部では、「return_response」で装飾された別の関数が何度も繰り返されることがあります。 – Sraw

+0

なぜ私は何度も何度もそれを待っていますか?私が正しく理解していれば、ラッパーは 'response = await response'で呼び出され、中止され、この行の直後に再開されます。 'if'文は2回チェックされません。 – mcferden

+0

すみません、最初のコメントはちょっと混乱していますが、私はそれを削除します。 – Sraw

答えて

1

多分このことを見てくださいWhat is the maximum recursion depth in Python, and how to increase it?しかし、答えはそれを増やすことにはなりません。

自分自身の内部から関数を呼び出すと、スタックに追加されたままになり、メモリがいっぱいになります。 Pythonにはこの制限が設定されているので、スタックオーバーフローに陥ることはありません。しばらくすると、その上限に達したように見えます。

106decorators.pyで起こっていることは、同じメソッドが繰り返し呼び出される原因となっています。私は完全な使用法を見ずに何が起こっているのかを確かめることができないだろうが、うまくいけばそれはあなたにちょっとしたアイデアを与える。

あなたのコードが再帰的に呼び出されている場所を見つけて、プログラムが再構成されないようにすることをお勧めします。

関連する問題