編集:threadsafe: true
マルチスレッドとは、自分のスレッドを作成しようとしているのではなく、app.yaml に設定したことを意味します。
GoogleAppEngine Python アプリケーションでマルチスレッドを使用しようとしています。
背景:
カスタム テンプレート ローダーを使用して、テンプレート作成に Django を使用しています。テンプレートが Django のテンプレート ローダーに初めて渡されるときに、テンプレートへのフル パスが指定されます。include
ただし、テンプレートが ( および を介して)参照する他のテンプレート ファイルの場合はextend
、ファイル名のみが渡され、ファイルへのフル パスを見つけるのはローダー次第です。これを行うために、最初のテンプレートからの完全なパスがローダーに保存され、そのパスを使用して、渡された他のファイルを見つけようとします。
これはシングルスレッド環境では問題ありませんが、マルチスレッド環境では、データストア リクエストなどのために 1 つのリクエストの子テンプレートのレンダリングに時間がかかる場合、別のリクエストがローダーを使用してファイルを見つけようとする可能性があることを意味します。保存されたパスを上書きします。最初のリクエストが戻ってきて、さらに子テンプレートをロードしようとすると、ローダーは間違った場所を探して、TemplateDoesNotExist エラーを発生させます。
私の提案した解決策:
現在のスレッドまたは現在のリクエストのいずれかを取得する方法があれば、ローダーでパスを検索するためのスレッド/リクエストのマッピングを作成できます。
threading.current_thread()
現在のスレッドを返すことになっています (スレッドが で作成されたと仮定しますthreading
)
しかし、AppEngine では、threading.current_thread() を呼び出すと、DummyThread のようなものが返されます<_DummyThread(Dummy-1, started daemon 4424339456)>
。
この DummyThread を安全に使用して現在のスレッドを識別できるかどうか、または現在のスレッドを取得するために他の方法を見つける必要があるかどうかは不明です。