3

以下の複製コードを参照してください。

メモリリークを追跡すると、reload(module)がすぐに有効にならないことがわかりました。

以下のプログラムは0,1,2,3,4を出力するはずですが、高速で実行すると、0,0,0,3,3などのシーケンスを出力します。sleep()関数の時間をたとえば1秒に増やすと、これが修正されるようです。

このコードは、問題を再現するためだけに、より実用的なコードを要約したものであることに注意してください。実際のアプリの状況に対処する必要があります。

安定性を確保する方法を知っている人はいますか?

私はWindows、cpython2732ビットを使用しています。

これを読んでくれてありがとう。

#このプログラムは、フォルダlib \ mymoduleが存在し、__init__。pyが含まれていることを前提としています
インポート時間
import io
gcをインポートする
modulefile ='c:\\ python27 \\ lib \\ mymodule \\ simplemodule.py'
range(5)のcntの場合:
    modulecode = "" "def runmodule():
    %iを返す
"" "%(cnt)
    obj = io.open(modulefile、u'wb')
    obj.write(modulecode)
    obj.close()
    cnt == 0の場合:
        mymodule.simplemoduleをインポートします
    そうしないと:
        リロード(mymodule.simplemodule)
    gc.collect()
    mymodule.simplemodule.runmodule()を出力します
    time.sleep(0.05)
4

1 に答える 1

4

問題は、根底にあるpyファイルに関して古くなっている場合を除き、 pycが再生成されないことです。ファイルの変更時間が 1 秒単位でチェックされている場合、更新は無視される可能性が高く、更新されたソースではなく古いpycが呼び出されます。

  • importまたはreloadごとにpycファイルを削除してみてください。

  • または、環境変数を設定することもできますPYTHONDONTWRITEBYTECODE=1

  • execfileを使用して、インポート ロジックをバイパスすることもできます。

于 2012-05-12T05:45:46.593 に答える