0

pyramid+sqlalchemyアプリを実行するように構成されたサーバーがありますmodwsgi+apache2

ピラミッドアプリには__init__.py、データベースを作成し、一部のテストユーザーとアカウントを事前入力するための機能がいくつかあります。これは、ピラミッドクックブックの例のinitialize_sql関数に似ています。

Out apache configは次のようになります(どこかからコピーされてハッキングされました):

WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
WSGIDaemonProcess pyramid user=ubuntu group=staff processes=1 \
   threads=4 \
   python-path= VIRTUAL_ENV_SITE_PACKAGES
WSGIScriptAlias / WSGI_SCRIPT_PATH

<Directory /Users/chrism/modwsgi/env>
  WSGIProcessGroup pyramid
  Order allow,deny
  Allow from all
</Directory>

私たちを悩ませているのは、initialize_functionが1回だけ呼び出されるのではなく、多くの要求で呼び出されることです。apacheがどのように機能するか、または構成で何をしたかがわかりません。__init__.py関数を一度に呼び出せるようにしたいのですが、それだけです。誰かがapacheが実際にどのように機能するのか、そしてなぜピラミッド__init__.pyが常にリロードされているのかを説明できますか?__init__.pyまた、すべてのリクエストが再実行されないようにする方法を説明します

同じものに関するわかりやすいリンクを共有することを検討してください:)

4

2 に答える 2

2

データベースの作成や事前入力など__init__.pyは、WSGIアプリケーションのファイルに入れないでください。お気づきのとおり、このファイルはサーバーを起動するたびに(および他の特定の時点でも)実行されるためです。

必要なのは、必要なときにいつでもコマンドラインから呼び出すことができるスクリプトです。すべてのフレームワークは、これらを構築するための独自の方法を提供します。ピラミッドでは、それらはと呼ばれconsole scriptsます。ここでは、自分で作成する方法のドキュメントを見つけることができます。

ただし、このチュートリアルのスキャフォールド(プロジェクトテンプレート)を使用して、と呼ばれるコンソールスクリプトを確認することをお勧めしますinitialize_tutorial_db。それはあなたが望むことを正確に行い、あなたが必要なときにいつでもコマンドラインからデータベースを作成/初期化することを可能にします。


アパッチ構成に関して、あなたの質問に関連する行は次のとおりです。

WSGIDaemonProcess pyramid user=ubuntu group=staff processes=1 \
   threads=4 \
   python-path= VIRTUAL_ENV_SITE_PACKAGES

これは、 4つのスレッドで1つのプロセスを開始することを意味します。これは、ファイル内のコードが複数回実行されることを意味するものではありません。これは、サーバーを手動で再起動したか、コードを変更したことが原因である可能性が高くなります。__init__.py

于 2013-02-11T16:46:04.753 に答える
1

秘訣は、WSGIDaemonProcessApacheに着信するすべての要求を処理するために、の複数のインスタンスが生成されることです。これらのプロセス内で、要求を(ほとんど)同時に処理するために複数のスレッドが作成される可能性もあります。たとえば、プロセス(またはスレッド)ごとに1回だけ実行されるように、initialize_function()を保護するようにしてください。たとえば、すでに実行されているかどうかを追跡します。一般に、アクション/リソース管理のスコープをリクエストの存続期間に限定することをお勧めします。

于 2013-02-11T10:31:10.407 に答える