Django を使用して App Engine で Python アプリケーションを実行しています。さらに、私は というセッション管理ライブラリを使用していgae-sessions
ます。threadsafe
が に設定されている場合は"no"
問題ありませんが、 が にthreadsafe
設定されて"yes"
いる場合、セッションが失われる問題が時々見られます。
私が見ている問題は、トレッドが有効になっている場合、GAE-Sessions ミドルウェアで複数のリクエストが時折インターリーブされることです。
gae-sessions
ライブラリ内には、変数_tls
である という変数がありthreading.local()
ます。ユーザーが Web サイトに対して http 要求を行うと、呼び出された関数process_request()
が最初に実行され、続いて現在のページの一連のカスタム html が生成され、次に呼び出された関数process_response()
が実行されます。process_request
との間の状態はprocess_response
、_tls
「スレッドセーフ」変数に記憶されます。_tls
値を出力することで、変数の一意性を確認でき_tls
ます (例: "<thread._local object at 0xfc2e8de0>"
)。
私が時折目にするのは、GAE-Sessions ミドルウェアのシングル スレッドのように見えるものです (thread_local オブジェクトのメモリ位置が同じであるという事実からシングル スレッドであると推測され、データがあるリクエストから別のリクエストのデータを上書きしているように見えます)、複数の http リクエストがインターリーブされています。User1 と User2 が同時にリクエストを行うと、次の実行順序が確認されました。
User1 -> `process_request` is executed on thread A
User2 -> `process_request` is executed on thread A
User2 -> `process_response` is executed on thread A
User1 -> `process_response` is executed on thread A
上記のシナリオでは、User2 セッションがいくつかの内部変数を踏みにじり、User1 のセッションが失われます。
だから、私の質問は次のとおりです: 1) App-Engine/Django/Python で予想されるミドルウェアの異なる要求のインターリーブですか? (または、私は完全に混乱しており、ここで何か他のことが起こっています) 2) このインターリーブはどのレベルで発生していますか (App-Engine/Django/Python)?
私はこの動作を見て非常に驚いているので、ここで何が起こっているのか/何が起こっているのかを理解したいと思っています.