请参阅下面的复制代码。
跟踪内存泄漏我发现重装(模块)不会立即生效。
下面的程序应该打印0,1,2,3,4但是,当快速执行时,它会输出像0,0,0,3,3这样的序列。将sleep()函数中的时间增加到例如1秒似乎可以解决这个问题。
请注意,此代码是更实用的代码的简化版本,只是为了重现问题,我需要处理现实应用中的情况。
有人知道如何确保稳定性吗?
我在Windows上,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)
答案 0 :(得分:4)
问题是 pyc 不会重新生成,除非它与未定义的 py 文件相比已过时。如果以1秒的分辨率检查文件修改时间,则可能会忽略您的更新,并且会调用过时的 pyc 而不是更新的源。
尝试在每个导入或重新加载之间删除 pyc 文件。
或者,您可以设置环境变量PYTHONDONTWRITEBYTECODE=1
。
您还可以使用execfile。