2

mod_wsgi/Python Web アプリケーションの奇妙な問題を突き止めようとしています。オブジェクトを作成してメソッドを呼び出すアプリケーション ハンドラーがあります。

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)

この最初と最後に、私は書きます

obj.num_files_found

ブラウザへ。

したがって、これはファイル内のファイル参照のツリーをたどる再帰関数です。ファイル内のすべての参照が印刷され、次にそれらの参照が開かれて調べられ、すべてのファイルがファイルを含まないリーフノードになるまで続きます。なぜ私がこれを行っているかはあまり重要ではありません...これはより衒学的な例です。

出力が決定論的であると期待するでしょう

そのような

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 関連のほぼすべてをリッピングして再インストールすると、問題が修正されました。何かがかなり壊れていましたが、今は大丈夫です:)

4

3 に答える 3

3

Apache/mod_wsgi がマルチ プロセス/マルチ スレッド構成の両方で実行される可能性があるため、単一のプロセスで実行されることを前提として記述されたコードがトリップする可能性があり、そのプロセスはおそらくシングル スレッドです。さまざまな構成の可能性と、それが共有データに対して何を意味するかについては、以下を参照してください。

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

于 2009-06-24T12:47:20.720 に答える
1

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

いいえ。

問題は(一般的に)プログラムのどこかにグローバル変数があり、それが期待どおりにリセットされないことです。

Python は変数のローカル名前空間とグローバル名前空間をチェックするため、これは意図しない場合があります。

うっかりして、いくつかのグローバル変数に依存する関数を持つことができます。私はこれに賭けます。

おそらく、多数の mod_wsgi デーモン プロセスが表示されており、それぞれにグローバル変数の問題があります。各デーモンの最初のリクエストが機能します。次に、グローバル変数は、作業が発生しない状態になります。[ファイルを開いたままにしておくと、最上位のディレクトリ変数が上書きされます。誰にもわかりません。]

最初のいくつかの後、すべてのデーモンは、実際の作業を行わずに回答を報告する「その他」モードでスタックします。

于 2009-06-05T19:39:29.263 に答える
1

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

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

何度も起こるように見える:

コール 3 の 22 行目に戻る

コール 3 の 22 行目に戻る

コール 3 の 22 行目に戻る

何かの制御フローに一貫したロジックがありません:(メソッドが呼び出された回数をカウントする単純なインクリメントコードを記述できることもかなり確信しています。絶対的で、イライラし、ナンセンスです。次にエポックタイムを入れますsapi.write() へのすべての呼び出しに対して、無意識にコードを繰り返していないことを確認します.それらは一意です:S

Apache、Python、mod_wsgi などを一掃して、もう一度やり直しましょう。

解決済み

それが何であるかは誰にもわかりませんが、Apache、mod_python、mod_wsgi、および HTTP 関連のほぼすべてをリッピングして再インストールすると、問題が修正されました。何かがかなり壊れていましたが、今は大丈夫です:)

于 2009-06-05T20:18:33.943 に答える