1

はじめに

約 10 年間の PHP の開発と習慣の後、最近 Python に切り替えました。

例えば。Symfony2 では、サーバー (Apache など) へのすべてのリクエストをロードする必要があります。コンテナ クラスを作成し、それをインスタンス化して、オブジェクトの「残り」を構築します。

私が理解している限り (願っています) Python の WSGI 環境では、アプリは一度作成され、そのアプリが閉じるまで、すべてのリクエストはメソッド/関数を呼び出すだけです。

これは、私が例えば持つことができることを意味します。リクエストがディスパッチされるたびにアクセスできるクラスの1つのインスタンスであり、リクエストごとにインスタンス化する必要はありません。私は正しいですか?

質問

__init__への呼び出しは非常にコストがかかるため (コンピューティングとリソースのロックアップの両方で) 、クラスのインスタンスを 1 つ持ちたいと考えています。PHP では、すべてのリクエストでこれをインスタンス化するとパフォーマンスが低下します。Python の WSGI を使用すると、アプリの起動時にこれを一度インスタンス化し、リクエストを通じて使用できるというのは正しいですか? もしそうなら、どうすればこれを達成できますか?

4

3 に答える 3

3

WSGI は、Web サーバー アーキテクチャのさまざまなコンポーネントを構築して相互に通信できるようにする標準化されたインターフェイスにすぎません。

Pyramid は、コンポーネントが WSGI を介して互いに接着されているフレームワークです。

Pyramid は、他の WSGI フレームワークと同様に、スタックの実際のサーバー部分 ( gunicorn、Apache など) を選択できるようにします。その選択はあなたが行うものであり、あなたの質問に対する究極の答えがあります。

知っておく必要があるのは、サーバーがマルチスレッドかマルチプロセスかです。後者の場合、コストのかかるリソースを初期化するためにグローバル変数がインスタンス化されているかどうかを確認するだけでは十分ではありません。これは、後続のリクエストが状態を共有しない別のプロセスになる可能性があるためです。

モデルがマルチスレッドの場合、確かにグローバル状態に依存している可能性がありますが、コードに強い依存関係を導入しているという事実に注意してください。おそらく、依存性注入と組み合わせたシングルトン パターンは、コードをよりクリーンに保ち、変更に対してよりオープンにするのに役立つ可能性があります。

于 2012-08-14T08:26:35.563 に答える
2

私が見つけた最良の方法は Pyramid docs で言及されていました (そして私は以前にそれを見逃していました):

Pyramid Docs#スタートアップから

**settingsコンストラクターに as として渡された値の拡張バージョンは、ConfiguratorPyramid ビューの呼び出し可能なコードで として利用できることに注意してくださいrequest.registry.settings。後でビューコードからアクセスしたいオブジェクトを作成し、それらを設定としてコンフィギュレーターに渡すディクショナリに入れることができます。これらは、request.registry.settingsアプリケーションの実行時にディクショナリに存在します。

于 2012-08-14T09:24:17.420 に答える
1

pyramid最終的に達成したい内容に応じて、 でこれを行う方法はいくつかあります。高価な初期化 (データベース接続とメタデータのセットアップ) を処理する方法の例として、 Pyramid/SQLAlchemy チュートリアルを詳しく調べてから、それを要求処理エンジンに渡すと役立つ場合があります。

参照リンクでは、質問の重要な部分は、__init__.pyファイルの処理initialize_sqlとその後の の作成であることに注意してくださいDBSession

于 2012-08-13T20:10:14.800 に答える