3

webapp2のドキュメントから:

デフォルトでは、モジュールwebapp2_extras.localが使用可能な場合、webapp2はスレッドセーフです。

ソースコードを調べると、アプリとリクエストの保存にローカルが使用されていることがわかります。ただし、すべてのスレッド間で共有されるアプリ(WSGIApplication)インスタンスは1つだけ(メインモジュールで作成するもの)であるという印象があるため、アプリインスタンスがスレッドローカル変数に格納されると、実際には同じインスタンスになります。 、これは、次のコード(webapp2_extrasから取得)が実際にはスレッドセーフではないことを意味します(get_appのアプリは、スレッドローカルストアから抽出されたとしても、実際にはすべてのスレッド間で共有されます)。

app = app or webapp2.get_app()
mako = app.registry.get(key)
if not mako:
    mako = app.registry[key] = factory(app)

ここで何が欠けていますか?

4

1 に答える 1

1

によって返されるアプリケーションはget_app()異なるスレッドによって共有されますが、必ずしも同じであるとは限りません。を作成する 2 つのモジュールがある場合WSGIApplication、get_app() はそれらに対して異なるインスタンスを返します。Mako インスタンスは特定のアプリにバインドされており、現在のアプリを取得する方法はスレッドセーフです。

于 2012-06-20T15:08:51.263 に答える