2009-06-05 8 views
2

私はmod_wsgi/Python Webアプリケーションで奇妙な問題を追跡しようとしています。私はブラウザにmod_wsgi/Pythonは最適化を行っていますか?

obj.num_files_found 

を書き、本の開始時と終了時に

def my_method(self, file): 
    self.sapi.write("In my method for %d time"%self.mmcount) 
    self.mmcount += 1 

    # ... open file (absolute path to file), extract list of files inside 
    # ... exit if file contains no path/file strings 
    for f in extracted_files: 
     self.num_files_found += 1 
     self.my_method(f) 

:私は、オブジェクトを作成し、メソッドを呼び出すアプリケーションハンドラを持っています。

これは、ファイル内のファイル参照のツリーを下にする再帰関数です。ファイル内のすべての参照が出力され、それらの参照はオープンされ、検査されます。すべてのファイルがファイルを含まないリーフノードになるまで続きます。なぜ私がこれをやっているのかは、それほど重要ではない。それはもっと賢明な例である。

あなたは出力がこのような予想通りそれは最初の数の要求に対して

Files found: 0 
In my method for the 0 time 
In my method for the 1 time 
In my method for the 2 time 
In my method for the 3 time 
... 
In my method for the n time 
Files found: 128 

そしてとして

決定論的であることを期待します。
はその後、私がいる限り、私は

Files found: 0 
In my method for the 0 time 
Files found: 128 

をリフレッシュして、私が知っているにもかかわらず、前回のリフレッシュなしコード/ファイルの変更から、それは128個のファイルを列挙するのn回を取ることについては、以下を得ます。

それでは質問mod_wsgi/Pythonには完全な実行を停止する内部最適化が含まれていますか?出力は決定論的でキャッシュであると推測されますか?

期待どおりのときにリフレッシュするたびに、REMOTE_PORTが1ずつ増えます。短い出力を使用すると、REMOTE_PORTの増分が大きく変化します。しかし、無関係かもしれない。

私は、Pythonに新しいです、

それが何だったか知っているのですが、Apache、mod_pythonの、mod_wsgiのとほぼすべてHTTPは関連をリッピングし、再インストールする固定

を解決

優しくして問題。何かがかなり壊れたですが、今は大丈夫です:)

答えて

1

"mod_wsgi/Pythonには完全な実行を中止する内部最適化が含まれていますか?

問題は、あなたがそれを望んだ道をリセット取得されていないどこかのプログラムでグローバル変数を持っていること(一般的に)です。

Pythonが変数のローカル名前空間とグローバル名前空間をチェックするため、時々これが意図せずになることがあります。

誤って、一部のグローバル変数に依存する関数を持つことができます。私はこれに賭けるだろう。

多くの場合、グローバル変数に問題があるmod_wsgiデーモンプロセスが多数あります。各デーモンの最初の要求が機能します。次に、グローバル変数は、作業が起こらないようにします。 [ファイルは開いたままで、トップレベルのディレクトリ変数は上書きされていますか?]

すべてのデーモンは、

+0

要求間のリセットを得ていないグローバル変数を? –

+0

@エイドンベル:グッドポイント。明確化が必要。 –

+0

説明のために修正されたサンプル出力。すべてがクラスに入っています。渡されたのは 'start_response'と 'environ'だけです。これはsapiという薄いラッパーに入れられています。 –

1

Python/mod_wsgiのインストールが壊れているようです。私はこのような奇妙なバグを見たことがない。リターンの隣 トレース:

self.sapi.write("Returning at line 22 for call %d"%self.times_called) 
return someval 

は数多くの時間が起こるように見える:ラインで返すコール3

用ライン22に戻るコール3

用ライン22に戻る

22コール3について

何かの制御フローには一貫したロジックがありません:(私はメソッドが呼び出された回数を数えるために単純なインクリメントコードを書くこともできると確信しています。絶対、イライラ、ナンセンス。私はsapi.write()を呼び出すたびにエポックタイムを置いて、それが間違いなくコードを繰り返していないことを確認しました。彼らはユニークです:S

Apache、Python、mod_wsgiと残りの部分をリッピングして残りを再開する時間です。

は、それが何であったかを知っているのですが、Apache、mod_pythonの、mod_wsgiのとほぼすべてHTTPは関連をリッピングし、再インストールする問題を修正し

を解決しました。何かがかなり壊れたですが、今は大丈夫です:)

3

Apache/mod_wsgiはマルチプロセス/マルチスレッド構成の両方で動作する可能性がありますが、これは単一プロセスで実行されるという前提で作成されています。そのプロセスはシングルスレッド化されている可能性があります。異なる設定可能性とどのような共有データのためのすべての手段というの議論については、以下を参照してください。

http://code.google.com/p/modwsgi/wiki/ProcessesAndThreading

+0

あなたの応答グラハムに感謝します。インストールによって何かが壊れているように見えました。シンプルな2メソッドの "hello world"スタイルクラスでは、論理的な理由がないため、メソッドが複数回呼び出されていました。 –

関連する問題