2011-02-05 22 views
2

経験豊富なJavaプログラマーがPythonを習得しようとしています。私はGoogle App Engineにアプリケーションを持っていて、管理ハンドラを別のファイルに移動したいと思っています。今はmain.pyとadmin.pyがあります。 app.yamlを設定してトラフィックを適切にルーティングし、各ファイルのWSGIApplication()を呼び出して適切なHandlerにルーティングしました。main()はハンドラを含むすべてのスクリプトに含まれている必要がありますか?

私の質問である各スクリプトファイルは、デフメイン必要があります()と文があれば対応しない:それは必要はありません

application = webapp.WSGIApplication([(r'/admin/(.*)', Admin)], 
             debug=True) 

def main(): 
    run_wsgi_app(application) 

if __name__ == '__main__': 
    main() 
+1

パスに基づいて異なるアクセス権レベルでapp.yamlに同じスクリプトファイルを2回リストすることはできません。 – Matt

答えて

4

app.yamlを直接参照する任意のスクリプトでこれが必要です。

App Engineは、あなたのスクリプトのいずれかに要求を送信する必要があるときはいつでも、それは、以下のステップを経る:

  1. スクリプトが以前にインポートされていますか?そうでない場合は、インポートして停止してください。
  2. 以前にスクリプトをインポートした場合は、mainという関数がありますか?そうでない場合は、再度インポートして停止してください。
  3. スクリプトのmain関数を実行します。

これは、モジュールのインポートが比較的高価で、1回のリクエストごとにモジュールを再インポートする必要がないためです。したがって、最適化が提供されます。mainという名前の関数を最初のリクエストの後に指定すると、スクリプトを再インポートする代わりにこの関数を実行するだけです。 if __name__ == "__main__":スタンザは、スクリプトの最初のインポートを検出し、その最初の要求に対して手動でmainを実行します。

一言で言えば、答えはmainifの両方の句を残しておくことも、両方を含めることもできます。あなたがそれらを残しておけば、あなたのアプリは少し効率が悪くなりますが、あなたは2つのうちの1つを含むが、他のものは含まないと問題に遭遇します。

+0

詳細な回答をありがとうNick。 –

+0

私の質問は、RequestHandlerを実装しているスクリプトに固有のものでした。しかし、あなたは、読み込まれたスクリプトは、インポートをより効率的にするために、このイディオムを含めるべきだと言っているのですか? –

+0

@Will 'app.yaml'から参照されるスクリプトです。 RequestHandlerを含むが直接実行されないスクリプトや、 'app.yaml'に直接リストされているもの以外のスクリプトに入れる必要はありません。 –

3

:あなただけかもしれない:

if __name__ == '__main__': 
    run_wsgi_app(application) 

は私が読書を覚えているようですリクエストが入るたびにファイルを再コンパイルするのではなく、バイトコンパイルされたフォームでキャッシュするため、main()の機能をお勧めします。

+0

わずかに言い換えると、 'main()'メソッドは必要ありませんが、 'if __name__ == '__main __''ブロック*は必須です。 –

+0

@ルーク:それはGoogleの設定によります。 'if __name__'トリックは、あなたがそれをインポートしているのか、それを実行しているのかをチェックします。私は、Googleが何をするのか正確には分かりません。しかし、私は間違いなくその場所でそれを持ってお勧めします。 –

+1

良い点。私はPython newbです。 "リクエストごとにPython実行可能ファイルを再実行するのではなく、1つのPythonランタイムが複数のリクエストに使用されます。各リクエストは、アプリケーションのメインハンドラスクリプトを単純に再インポートします。それからロードされたモジュールは再インポートされませんが、さらに最適化として、ハンドラモジュールで 'main'という関数を提供すると、その関数は2番目以降の要求で実行されますモジュールを再インポートするのではなく、 –

関連する問題