请参阅下面的复制代码。
跟踪内存泄漏我发现 reload(module) 不会立即生效。
下面的程序应该打印 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)
问题是一个pyc不会重新生成,除非它相对于底层已经过时py文件。如果以一秒的分辨率检查文件修改时间,则您的更新可能会被忽略并且过时的pyc被调用而不是您更新的源。
尝试删除pyc每个之间的文件import or reload.
或者,您可以设置环境变量PYTHONDONTWRITEBYTECODE=1
.
您还可以使用绕过导入逻辑execfile http://docs.python.org/library/functions.html#execfile.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)