以下の再現コードを参照してください。Pythonリロードモジュールがすぐに有効にならない
メモリリークのトレースリロード(モジュール)がただちに有効にならないことがわかりました。
以下のプログラムは0,1,2,3,4を出力するはずですが、速く実行すると0,0,0,3,3などのシーケンスが出力されます。 sleep()関数の時間を例えば1秒に増やすことは、これを修正するようです。
このコードは、問題を再現するための実用的なコードの煮詰めバージョンであり、実際の生活アプリの状況に対処する必要があることに注意してください。
誰でも安定性を確保する方法を知っていますか?
私は窓に、cpython27 32ビットです。
お読みいただきありがとうございます。
# this program assumes folder lib\mymodule exists and contains __init__.py import time import io import gc modulefile = 'c:\\python27\\lib\\mymodule\\simplemodule.py' for cnt in range(5): modulecode = """def runmodule(): return %i """%(cnt) obj = io.open(modulefile, u'wb') obj.write(modulecode) obj.close() if cnt==0: import mymodule.simplemodule else: reload(mymodule.simplemodule) gc.collect() print mymodule.simplemodule.runmodule() time.sleep(0.05)
実際のアプリで 'reload()'を使用していますか?私はそれがインタラクティブな便利のためだと思った。 –
これはリロードの正当な使用例です。ソースファイルが変更されたときはいつでも(自動でも編集でも)、* reload *は* sys.modules *にキャッシュされたバージョンをバイパスする方法です。 –